%E5%A4%9A%E6%8C%87%E9%92%88 - wenzhoullq/leetcode GitHub Wiki

双指针模拟

题目

2337. 移动片段得到字符串

777. 在LR字符串中交换相邻字符

1537. 最大得分公共部分取较大

1754. 构造字典序最大的合并字符串用a.compareto(b)

2444. 统计定界子数组的数目 三指针维护

E. Two Platforms-2023.1.17-灵茶 维护一个最大值的思想需要学习

1616. 分割两个字符串得到回文串 前后缀越回文,中间部分越回文

1147. 段式回文贪心,枚举长度

排序

while(i+1<nums.length&&nums[i]==nums[i+1])

题目

  • 摆动排序

选择较大部分保持绝对性

324. 摆动排序 II

  • 去除目标

26. 删除有序数组中的重复项

27. 移除元素

80. 删除有序数组中的重复项 II

228. 汇总区间

283. 移动零

原地排序

模板

原地排序的关键词在于 时间复杂度为O(n)并且额外的空间为O(1),数字在[0,n]是充分不必要条件

最外层一个for循环,如果有[0,n]的条件,那么这里的下标就替代指针了;如果没有则里面设置两个指针,分别指向left(0)和right(nums.length-1)

        for(int i=0;i<nums.length;i++){
            while(nums[i]<nums.length&&nums[i]>0&&nums[i]!=i+1&&nums[nums[i]-1]!=nums[i]){//关键在于这个while而不是if,因为交换过来的数字还得需要继续交换
                int temp=nums[i];
                nums[i]=nums[temp-1];
                nums[temp-1]=temp;
            }
        }

题目

41. 缺失的第一个正数

75. 颜色分类

268. 丢失的数字

287. 寻找重复数

多指针求和

分析

多指针求和需要先排序,然后固定n个指针,剩下的进行遍历,然后因为去重的需求,因此考虑去重的代码

模板

        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            int left=i+1,right=nums.length-1,target=nums[i]*-1;
            while(left<right){
                if(nums[left]+nums[right]<target) left++;
                else if(nums[left]+nums[right]>target) right--;
                else {
                    while(left+1<right&&nums[left]==nums[left+1]) left++;// 关键点在相等的时候进行去重
                    while(left+1<right&&nums[right]==nums[right-1]) right--;
                    ans.add(Arrays.asList(new Integer[]{nums[i],nums[left],nums[right]}));
                    left++;
                    right--;
                }
            }
            while(i+1<nums.length&&nums[i]==nums[i+1]) i++;//指针去重
        }
        return ans;

题目

1. 两数之和 这个是非模板的题,但是也只有这题是特殊的

2857. 统计距离为 k 的点对 (k <= 100是突破口,枚举K做类似于两数之和

15. 三数之和

16. 最接近的三数之和

18. 四数之和

167. 两数之和 II - 输入有序数组

模拟

多指针模拟,无固定模板

题目

290. 单词规律

299. 猜数字游戏

6117. 坐上公交的最晚时间

多指针+数据结构

2817. 限制条件下元素之间的最小绝对差

2905. 找出满足差值条件的下标 II

⚠️ **GitHub.com Fallback** ⚠️