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

简介: 移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和

  image.gif 编辑

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

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

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

目录

第一题:移动零

第二题:复写零

第三题:快乐数

第四题:盛最多水的容器

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

第六题:和为s的两个数

第七题:三数之和

第八题:四数之和


第一题:移动零

283. 移动零 - 力扣(LeetCode)

image.gif 编辑

image.gif 编辑

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++;
        }
    }
}

image.gif

第二题:复写零

1089. 复写零 - 力扣(LeetCode)

image.gif 编辑

image.gif 编辑

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--;
            }
        }
    }
}

image.gif

第三题:快乐数

202. 快乐数 - 力扣(LeetCode)

image.gif 编辑

image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif

第四题:盛最多水的容器

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

image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif

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

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

image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif

第六题:和为s的两个数

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

image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif

第七题:三数之和

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

image.gif 编辑 image.gif 编辑

image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif

第八题:四数之和

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

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

image.gif 编辑 image.gif 编辑

image.gif 编辑

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;
    }
}

image.gif


相关文章
|
算法 搜索推荐
【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)
【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)
104 0
|
7月前
|
算法 容器
『 基础算法题解 』之双指针(下)
『 基础算法题解 』之双指针(下)
|
7月前
|
算法 测试技术 容器
『 基础算法题解 』之双指针(上)
『 基础算法题解 』之双指针(上)
|
存储 算法 测试技术
|
算法 编译器 Go
【LeetCode 算法专题突破】双指针(⭐)
【LeetCode 算法专题突破】双指针(⭐)
59 0
[LeetCode算法->双指针]
1.给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 解析:这道题可以通过双指针来求解,即给定i和j,分别指向0位置和numsize -1的位置, 比较两个指针所指向的元素的平方的大小,大的逆序放在要返回的数组中。为什么要逆序呢? 由于已知数组是非递减顺序排序的: 假如输入的数组全是非负数,那么平方后也是一个递增顺序。 假如输入的数组全是负数,那么平方后是一个递减的顺序。 假如输入的数组有负数,有非负数,那么平方后的情况就尾部是递减或递增的。 所以逆序存放平方后大的元素,就不再需要讨论上面的情况。
|
算法 vr&ar C++
【AcWing】双指针算法
这一篇博客也用了双指针算法,同学们可以参考一下
107 0
|
算法
14天刷爆LeetCode算法学习计划——Day02双指针(2)
k %= n一定要写,不然当 k=nums.length 时就会出现运行结果错误的情况,读者朋友可以自己在力扣网上试验一下
135 0
14天刷爆LeetCode算法学习计划——Day02双指针(2)
|
机器学习/深度学习 算法 NoSQL
14天刷爆LeetCode算法学习计划——Day04 双指针(1)
14天刷爆LeetCode算法学习计划——Day04 双指针(1)
137 0
14天刷爆LeetCode算法学习计划——Day04 双指针(1)
|
算法
14天刷爆LeetCode算法学习计划——Day03 双指针(2)
当我们的sum 比 target(要求的和)大的话,由于数组按照递增的顺序,既然此时left指向的已经是数组最小值了,那么只能将right指向的值变得更小,即 right的值减1
79 0
14天刷爆LeetCode算法学习计划——Day03 双指针(2)

热门文章

最新文章