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

简介: 移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为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


相关文章
|
2月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
2月前
|
算法 数据挖掘
【栈和队列】算法题 ---- 力扣(二)
【栈和队列】算法题 ---- 力扣
|
2月前
|
存储 算法
【栈和队列】算法题 ---- 力扣(一)
【栈和队列】算法题 ---- 力扣
|
3月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
76 4
|
2月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
2月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣
|
2月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
4月前
|
算法 容器
【算法】双指针
【算法】双指针
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
108 80