查看: 790| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 双指针系列

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
关于双指针大致可分为四大类型
1. 快慢指针  对应题号 27, 283, 26, 80, 287
2. 左右指针  对应题号 167, 15, 16, 18, 11, 42
3. 后序指针  对应题号  88, 977
4. 其它类型  对应题号 459, 28

此贴会着重介绍快慢指针系列。
快慢指针最直观的一题是关于linked list的题目LeetCode 141 题
顾名思义,就是定义两个指针,一个跑两个单位,一个跑一个单位直到达到目地为止

我们先来看27题 Remove Element
这道题的题意就是,在同一个array中删除指定的val。难点有2。第一是在同一array 操作,不能产生额外的space,第二是删除后,若后面还有element还要把删除空的位置补齐。

思路就是
1.定义一个Slow 指针 K = 0
2. 循环整个array (相当于一个快指针)
3. 如果当前点不等于 指定的 val 则把慢指针 位置 设置为快指针位置的value

来看代码

  1. class Solution {
  2.     public int removeElement(int[] nums, int val) {
  3.         int k = 0;
  4.         for(int i = 0; i < nums.length; i++){
  5.             if(nums[i] != val){
  6.                 nums[k++] = nums[i];
  7.             }
  8.         }
  9.         return k;
  10.     }
  11. }
复制代码
那么练习一下 可尝试一下283题
这道题就是把所有的0 放到末尾,有了上面的例子这道题就是很简单。多了一点就是要k跑完之后要一直跑到array末尾把0都续上

  1. class Solution {
  2.     public void moveZeroes(int[] nums) {
  3.         int k = 0;
  4.         for(int i = 0; i < nums.length; i++){
  5.             if(nums[i] != 0){
  6.                 nums[k++] = nums[i];
  7.             }
  8.         }
  9.         while(k != nums.length) nums[k++] = 0;
  10.     }
  11. }
复制代码
26 和 80题都是差不多思路 也就不多说上code
Leetcode 26

  1. class Solution {
  2.     public int removeDuplicates(int[] nums) {
  3.         int k = 1;
  4.         for(int i = 1; i < nums.length; i++){
  5.             if(nums[i] != nums[k - 1]){
  6.                 nums[k ++] = nums[i];
  7.             }
  8.         }
  9.         return k;
  10.     }
  11. }
复制代码
Leecode 80

  1. class Solution {
  2.     public int removeDuplicates(int[] nums) {
  3.         int k = 2;
  4.         for(int i = 2; i < nums.length; i++){
  5.             if(nums[i] != nums[k - 2]){
  6.                 nums[k ++] = nums[i];
  7.             }
  8.         }
  9.         return k;
  10.     }
  11. }
复制代码
这几道题里最难得一题就是287了。这道题的思路和142这道题是一样的。如果有duplicate就说明会有一个环存在。
具体的数学公式请看我上一个帖子
传送门 https://www.1point3acres.com/bbs/thread-816987-1-1.html

  1. class Solution {
  2.     public int findDuplicate(int[] nums) {
  3.         int slow = nums[0];
  4.         int fast = nums[nums[0]];
  5.         //找到 两点相遇点
  6.         while(slow != fast){
  7.             slow = nums[slow];
  8.             fast = nums[nums[fast]];
  9.         }
  10.         slow = 0;
  11.        //慢指针重新出发 当和fast相遇的时候就是结果出现的时候
  12.         while(slow != fast){
  13.            slow = nums[slow];
  14.             fast = nums[fast];
  15.        }


  16.         return fast;
  17.     }
  18. }
复制代码

评分

参与人数 2大米 +9 收起 理由
14417335 + 8 很有用的信息!
deanwong + 1 很有用的信息!

查看全部评分


上一篇:Leetcode给了个感恩节discount
下一篇:领英近期力扣高频题
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表