算法-双指针

目录

移动零

关键是i找到0,j找到非0,此时仅i<j才移动,否则j++后重新循环

java 复制代码
public class 移动零 {
    class Solution {
        public void moveZeroes(int[] nums) {
            int zero = 0;
            int nzero = 0;
            while (zero<nums.length && nzero<nums.length){
                while (nums[zero]!=0){
                    zero++;
                    if (zero>= nums.length)return;
                }
                while (nums[nzero]==0){
                    nzero++;
                    if (nzero>= nums.length)return;
                }

                if (zero < nzero){
                    int temp = nums[zero];
                    nums[zero++] = nums[nzero];
                    nums[nzero++] = temp;
                }else{
                    nzero++;
                }
            }
        }
    }
}

三数之和

排序+set去重 。用map记录每个元素,重复时 仅记录最后一个元素。

这题耗时太长了,但是最优解没时间看了。

java 复制代码
public class 三数之和 {
    class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
            Map<Integer, Integer> map = new HashMap<>();// 对于重复元素这里只需要记最后一个index就行了
            HashSet<String> set = new HashSet<>();// 用于去重
            Arrays.sort(nums);
            ArrayList<List<Integer>> res = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                map.put(nums[i], i);
            }

            for (int i = 0; i < nums.length; i++) {
                for (int j = i+1; j < nums.length; j++) {
                    if (map.containsKey(-(nums[i]+nums[j])) && map.get(-(nums[i]+nums[j]))>j){
                        if (!set.contains(""+nums[i]+nums[j]+(-nums[i]-nums[j]))){
                            ArrayList<Integer> list = new ArrayList<>();
                            list.add(nums[i]);
                            list.add(nums[j]);
                            list.add(-nums[i]-nums[j]);
                            res.add(list);
                            set.add(""+nums[i]+nums[j]+(-nums[i]-nums[j]));
                        }
                    }
                }
            }
            return res;
        }
    }
}

盛最多水的容器

短板效应(贪心),如果移动长边那么宽度会减小,高度不变或减小,所以总的面积一定减小,只有移动短边才可能比原来的面积大,因此使用双指针向中间,不断移动短边并更新最大值。

java 复制代码
public class 盛最多水的容器 {
    class Solution {
        public int maxArea(int[] height) {
            int res = 0;
            int left = 0, right = height.length - 1;
            while (left < right){
                res = Math.max(res, Math.min(height[left], height[right])*(right-left));
                if (height[left]>height[right]) right--;
                else left++;
            }
            return res;
        }
    }
}

接雨水

"盛最多水的容器"每个位置是一条边,而该问题中每个位置可以看作一个桶,计算总的接水量就是每个位置的节水量的和(由整体到分解为子问题的思想),那么每个位置的最大接水量取决于min(该位置左边的最大高度,该位置右边的最大高度)

java 复制代码
public class 接雨水 {
    class Solution {
        public int trap(int[] height) {
            int res = 0;
            int[] lMax = new int[height.length + 2];
            int[] rMax = new int[height.length + 2];
            for (int i = 1; i <= height.length; i++) {
                lMax[i] = Math.max(lMax[i-1], height[i-1]);
            }
            for (int i = height.length; i >= 1; i--) {
                rMax[i] = Math.max(rMax[i+1], height[i-1]);
            }

            for (int i = 1; i <= height.length; i++) {
                res += Math.max(0, Math.min(lMax[i-1], rMax[i+1]) - height[i-1]);
            }
            return res;
        }
    }
}
相关推荐
灵感__idea1 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
lwf0061643 小时前
导数学习日记
学习·算法·机器学习
头发够用的程序员4 小时前
从滑动窗口到矩阵运算:img2col算法基本原理
人工智能·算法·yolo·性能优化·矩阵·边缘计算·jetson
武帝为此4 小时前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn5 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越5 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
黎阳之光5 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
CappuccinoRose6 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿
AC赳赳老秦6 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw
Robot_Nav7 小时前
Shape-Aware MPPI(SA MPPI)算法:基于RC-ESDF的任意形状机器人实时轨迹优化
算法·机器人·sa-mppi