基础数据结构之顺序表练习

1.给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6
提示:
3 <= nums.length <= 104
-1000 <= nums[i] <= 1000
首先将数组排序。
如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
public class Solution {
    public static int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int n=nums.length;
        return Math.max(nums[0]*nums[1]*nums[n-1],nums[n-1]*nums[n-2]*nums[n-3]);

    }

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        List input=new ArrayList<>();
        int t;
        while((t=scanner.nextInt())!=-1)
        {
            input.add(t);
        }
        int[] nums=new int[input.size()];
        for(int i=0;i
2.已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:
输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:
输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 中的所有整数 互不相同
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
public class Solution {
    public static int findMin(int[] nums) {
        int low=0;
        int high=nums.length-1;
        while(low inputList = new ArrayList<>();
        int t;
        while((t=scanner.nextInt())!=-1)
        {
            inputList.add(t);
        }
        int[] nums = new int[inputList.size()];
        for (int i = 0; i < inputList.size(); i++) {
            nums[i] = inputList.get(i);
        }
        int x=findMin(nums);
        System.out.println(x);
    }
}
3.桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
示例 1:
输入:[4,2,1]
输出:4
解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。
示例 2:
输入:[2,3,10]
输出:8
限制:
1 <= n <= 4
1 <= coins[i] <= 10
public class Solution {
    public static int minCount(int[] coins) {
        int min=0;
        int t=0;
        int[] a=new int[coins.length];
         for(int num:coins)
         {
             min=num;
             for(int i=0;ii+j) {
                             min=i+j;
                         }
                     }
                 }
             }
             a[t++]=min;
         }
         int total=0;
         for(int x=0;x input=new ArrayList<>();
        int t;
        while((t=scanner.nextInt())!=-1)
        {
            input.add(t);
        }
        int[] nums=new int[input.size()];
        for(int i=0;i
4.最大连续 1 的个数
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
示例 1:
输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:
输入:nums = [1,0,1,1,0,1]
输出:2
提示:
1 <= nums.length <= 105
nums[i] 不是 0 就是 1.
class Solution {
    public static int findMaxConsecutiveOnes(List nums) {
            int maxCount=0;
            int currentCount=0;
            for(int num:nums)
            {
                if(num==1)
                {
                    currentCount++;
                    maxCount=Math.max(maxCount,currentCount);
                }
                else{
                    currentCount=0;
                }
            }
            return maxCount;
    }

    public static void main(String[] args) {
        List nums=new ArrayList<>();
        Scanner scanner=new Scanner(System.in);
        int t=0;
        while((t=scanner.nextInt())!=-1)
        {
            nums.add(t);
        }
        int x=findMaxConsecutiveOnes(nums);
        System.out.println(x);
    }
}
5.给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
public class Solution2 {
    public static int thirdMax(int[] nums) {
        Arrays.sort(nums);
        reverse(nums);
        for (int i = 1, diff = 1; i < nums.length; ++i) {
            if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数
                return nums[i];
            }
        }
        return nums[0];
    }

    public static void reverse(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        List input=new ArrayList<>();
        int t;
        while((t=scanner.nextInt())!=-1)
        {
            input.add(t);
        }
        int[] nums=new int[input.size()];
        for(int i=0;i

你可能感兴趣的:(基础数据结构,数据结构,算法)