自学内容网 自学内容网

【算法】——双指针算法合集(力扣)

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

第一题:移动零

第二题:复写零

第三题:快乐数

第四题:盛最多水的容器

第五题:有效三角形的个数

第六题:和为s的两个数

第七题:三数之和

第八题:四数之和


 

 

第一题:移动零

283. 移动零 - 力扣(LeetCode)

dc170944f8264779a0529ff8bc82ab4d.png

6dd9fe7273084b61845aacc2605c8a76.png

class Solution {
      public void moveZeroes(int[] nums) {
        int dest = -1;
        int cur = 0;
        int tem = 0;

        while(cur < nums.length){
            if(nums[cur] != 0){
                dest++;
                tem = nums[dest] ;
                nums[dest] = nums[cur];
                nums[cur] = tem;
            }
                cur++;
        }

    }
}

第二题:复写零

1089. 复写零 - 力扣(LeetCode)

249c2e799cd2473388d21fce909a5f8e.png

913e5ee615a444928523b49d78e47471.png

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur = 0 , dest = -1 , n = arr.length;
        while(cur <= n){//dest位置不确定所以不能用作判断循环的条件
           if(arr[cur] != 0){
            dest++;
           }else{
            dest += 2;
           }
           if(dest >= n-1){
            break;
           }
           cur++;
        }
        if(dest == n){
            arr[n-1] = 0;
            dest -= 2;
            cur--;
        }

        //开始从后往前复写
        while(cur >= 0 ){
            if(arr[cur] != 0){
                arr[dest] = arr[cur];
                cur--;
                dest--;
            }else{
                arr[dest] = arr[cur];
                dest--;
                arr[dest] = arr[cur];
                cur--;
                dest--;
            }
        }
    }
}

第三题:快乐数

202. 快乐数 - 力扣(LeetCode)

aeba3d1463834acd9af530221afb1078.png

02762e2f156742f98611d3fce4b8a0a9.png

a33cb7dbe06b482b9a087cdc6a3893d7.png

class Solution {
    public static int sumResult(int n){
        int sum = 0;
        while(n != 0){
            //int tem = n % 10;
            //sum += tem * tem;
            sum += Math.pow(n%10,2);
            n = n/10;
        }
        return sum;
    } 
    public boolean isHappy(int n) {
        int slow = n ,fast = sumResult(n);
        while(slow != fast){
            slow = sumResult(slow);
            fast = sumResult(sumResult(fast));
        }
        return slow == 1;
    }
}

第四题:盛最多水的容器

11. 盛最多水的容器 - 力扣(LeetCode)

6d0ea7a48fca4af88a38d01616b17e6c.png

1d94eea0dbd84c8aba1245d6d3282a4b.png

class Solution {
    public int maxArea(int[] height) {
        int left = 0 ,right = height.length -1 , ret = 0;
        while(left < right){
            int v = Math.min(height[left],height[right]) * (right - left);
            ret = Math.max(ret,v);
            if(height[left] < height[right]){
                left++;
            }else{
                right--;
            }
        }
        return ret;

    }
}

第五题:有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode)

228e26d7d962483b83c553ba1b02f2e7.png

c7ed088cd3f64b4d8ac1e859ae1bceec.png

class Solution {
    public int triangleNumber(int[] nums) {
        int end = nums.length-1;
        Arrays.sort(nums);
        int count = 0;
        for( ; end >= 2 ; end--){
            int right = end-1;
            int left = 0;
            while(left < right){
            int tem = nums[left] + nums[right];
                if(tem > nums[end]){
                    count += right - left;
                    right--;
                }else{
                    left++;
                }
            }            
        } 
        return count;
    }
}

 

第六题:和为s的两个数

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

bd601b781b184576803517b67f06883e.png

 

8303f5bdfba743fba3a88d5111e094f9.png

class Solution6 {
    public int[] twoSum(int[] price, int target) {
        int n = price.length;
        int left = 0 , right = n-1;
        int[] car = {-1,-1};
        while(left < right){
            int result = sum(price[left],price[right]);
            if(result < target){
                left++;
            }else if(result > target){
                right--;
            }else{
                car[0] = price[left];
                car[1] = price[right];
                return car;
            }
        }
        return car;

    }
    public int sum(int a , int b){
        int sum = a + b;
        return sum;
    }
}

第七题:三数之和

15. 三数之和 - 力扣(LeetCode)

7c4131c6891446459ae1280f0c087b7c.png1a956207fbf34b489499ac5952970b4f.png

c93304014deb493689333cc6fadef7be.png

07a52397256e46a196d045444ee3c985.png

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> ret = new ArrayList<>();
        for(int i = 0 ; i < n ;){
            if(nums[i] > 0){
                break;
            }
            int left = i+1 , right = n-1 ,target = -nums[i];
            while(left < right){
                int sum = sum(nums[left] , nums[right]);
                if(sum > target){
                    right--;
                }else if(sum < target){
                    left++;    
                }else{
                    ret.add(Arrays.asList(nums[left] , nums[right] , nums[i]));
                    left++;
                    right--;
                    while(left < right && nums[left] == nums[left - 1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right + 1]){
                        right--;
                    }
                }
            }
            i++;
            while(i < n && nums[i] == nums[i-1]){
                i++;
            }

        }
        return ret;

    }
    public int sum(int a , int b){
        return a+b;
    }
}

第八题:四数之和

18. 四数之和 - 力扣(LeetCode)

强烈建议先把三数之和看完

86885d57ac144a26a092fc447bb4cedb.pngb5f2282a187f4384afe316c9c019953a.png

5e777747202b437ab2625950f1d58a2c.png

 

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList();
        Arrays.sort(nums);
        int n = nums.length;
        for(int i = 0 ; i < n ; ){
            //第一层循环遍历固定a遍历数组
            int a = nums[i];
            for(int j = i+1 ; j < n ; ){
                int b = nums[j] , left = j+1 ,right = n-1;
                long tem = (long)target - a - b;
                while(left < right){
                    long sum = sum(nums[left],nums[right]);
                    if(sum > tem){
                        right--;
                    }else if(sum < tem){
                        left++;
                    }else{
                        list.add(Arrays.asList(a,b,nums[left],nums[right]));
                        left++;
                        right--;
                        while(left < right && nums[left] == nums[left-1]){
                            left++;
                        }
                        while(right > left && nums[right] == nums[right+1]){
                            right--;
                        }
                    }
                }
                j++;
                while(j < n-2 && nums[j] == nums[j-1]){
                    j++;
                }
            }
            i++;
            while(i < n-1 && nums[i] == nums[i-1]){
                i++;
            }

        }
        return list;


    }
    public int sum(int a , int b){
        return a+b;

    }
}

 

 


原文地址:https://blog.csdn.net/2301_80133875/article/details/142737911

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!