LeetCode刷题之数组

  • Three Sum(求三数之和)

思路:

    1:对数组进行排序

    2:依次取出第i个数作为定值,并且不重复的选取,目的是为了将三数求和转化为两数求和

    3:定义两个指针,左指针和右指针

    4:将定值与左右指针指向的数相加,如果定值=左右指针,那么记录这三个数,如果大于定值,右指针向左移,小于定值,左指针向右移动

代码:

    

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        if(nums.length == 0)
            return result;
        Arrays.sort(nums); //进行排序
        int sum=0 ;
        int left; // 左指针
        int right; //右指针
        for(int i=0;i<nums.length-2;i++){
            if(i!=0 && nums[i]==nums[i-1]) //跳过重复的数字
            {
                continue;
            }
            left = i+1;
            right = nums.length-1;
            while(left<right){
                sum = nums[left]+nums[right];
                if(sum + nums[i] ==0){
                    List<Integer> solution = new ArrayList<>();
                    solution.add(nums[i]);
                    solution.add(nums[left]);
                    solution.add(nums[right]);
                    result.add(solution);
                    left++;
                    right--;
                    while(left<right && nums[left]==nums[left-1])
                        left++;
                    while(left<right && nums[right]== nums[right+1])
                        right--;
                }else if(sum+nums[i]>0){
                    right--;
                }else
                    left++;
            }
        }
        return result;
    }
}
  • Majority Element(求众数)

思路:

从数组的下标1开始,如果与下一个数组下标的数字不相等,则count-- 当count 为0 就切换为下一个比较的数字

代码:

class Solution {
    public int majorityElement(int[] nums) {
        int count=1;
        int major = nums[0]; 
        for(int i=1;i<nums.length;i++){
            if(major == nums[i])
                count ++;
            else{
                count--;
                if(count==0)
                    major = nums[i+1];
            }
        }
        return major;
    }
}
  • Missing Positive(求缺失的第一个正数)

思路:

    用数组本身做Hash,将i放在位置i-1处,如果i不在i-1处,那么就与i-1处的值进行交换

代码:

    

class Solution {
    public int firstMissingPositive(int[] nums) {
        for(int i=0;i<nums.length;i++){
            if(nums[i]>0 && nums[i]<nums.length && nums[i]!=nums[nums[i]-1]){
                int temp = nums[nums[i]-1];
                nums[nums[i]-1] = nums[i];
                nums[i] = temp;
                i--; //交换完该位置上的数不一定是该位置上应有的数,所以重新判断
          
            } 
        }
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=i+1)
                return i+1;
        }
        return nums.length+1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值