LeetCode Hot100 (双指针)

283. 移动零

标记指针,当前位置为0向后面移动即可

 class Solution {
    public void moveZeroes(int[] nums) {
        int l = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0){
                if(l<i){
                    l=i+1;
                }
                while(l<nums.length&&nums[l]==0) l++;
                if(l<nums.length){
                    nums[i]=nums[l];
                    nums[l]=0;
                    l++;
                }
                
            }
            
        }
        String s=nums.toString();
        System.out.println(s);
    }
}

 11.成最多水的容器

一个比较简单的做法,我们可以直接从高进行枚举,看看水会淹没到哪个位置,双指针左右移动即可

class Solution {
    public int maxArea(int[] height) {
        int maxx=0;
        for(int i=0;i<height.length;i++){
            maxx=Math.max(height[i],maxx);
        }
        int l=0;
        int ans=0;
        int r=height.length-1;
        int n=r-1;
        for(int i=1;i<=maxx;i++){
            while(l<=n&&height[l]<i){
                l++;
            }
            while(r>=0&&height[r]<i){
                r--;
            }
            if(r<=l){
                break;
            }
            ans=Math.max((r-l)*i,ans);
        }
        return ans;
    }
}

15.三数之和

我们注意到数字不能有重复的,我们对数组进行排序之后,固定最左边位置的数字,然后枚举右边的两个数字即可,为了降低时间复杂度,双指针维护

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List< List<Integer> >res = new ArrayList<>();
        Arrays.sort(nums);
//        System.out.println(Arrays.toString(nums));
        for(int i = 0; i < nums.length ; i++){
            if(i>0){
                if(nums[i]==nums[i-1]){
                   
                    continue;
                }
            }
            if(nums[i]>0){
                continue;
            }
            int l=i+1;
            int r=nums.length-1;
            while(l<r){
                while(l<=r&&nums[l]+nums[r]+nums[i]<0){
                    l++;
                }
                while(l<r&&nums[l]+nums[r]+nums[i]>0){
                    r--;
                }
                if(l>=r){
                    break;
                }
                if(nums[i]+nums[l]+nums[r]==0){
                    List<Integer>arr=List.of(nums[i],nums[l],nums[r]);
                    res.add(arr);
                }
                l++;
                while(l<nums.length&&nums[l]==nums[l-1]){
                    l++;
                }


            }
        }

        return res;
    }
}

42. 接雨水

最简单的困难题

实际上每一个点看看前面的最大值和后面的最大值,也就是那两个可以把他包围起来,然后两个最大值取个较小值就ok了

class Solution {
     public  int trap(int[] height) {
        if(height.length==0){
            return 0;
        }
        int []maxx1=new int[height.length+3];
        int []maxx2=new int[height.length+3];
        maxx1[0]=height[0];
        for(int i=1;i<height.length;i++){
            maxx1[i]=Math.max(maxx1[i-1],height[i]);
        }
        for(int i=height.length - 1;i>=0;i--){
            maxx2[i]=Math.max(maxx2[i+1],height[i]);
        }
        int ans=0;
        for(int i=1;i<height.length - 1;i++){
            int f=ans;
            ans=ans+Math.max(0,Math.min(maxx1[i-1],maxx2[i+1])-height[i]);
           
        }

        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值