从零上手双指针

先分享一个很有意思的视频 https://www.bilibili.com/video/BV1Ku411z7VT

算法数据结构这类课程的博客做起来不太方便

t83,t26,这两道题目,一个场景是链表,一个场景是数组可以说十分有代表性

先看链表题型

image-20220906143134468

总体思路的注意点一共有三个

  1. 快指针停止的终止条件
  2. 判断快慢指针是否相等
  3. 快慢指针值不相等时如何操作

主要是第三点的不一样,重点关注下这一点,我一开始其实也不太容易想明白,我的办法是,找一个中间状态来看

image-20220906152125353

最后有一点需要注意的是,需要把slow.next清空,考虑存在情况

image-20220906152401227

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null) return null;
        ListNode slow = head, fast = head;
        while(fast!=null){
            if(fast.val!=slow.val){
                slow.next = fast;
                slow = slow.next;
            }
            fast = fast.next;
        }
        // 设置 slow.next 为null
        slow.next = null;
        return head;
    }
}
image-20220906143200742

这题的关键在于首先在于原地修改,我们常规的思路是做不到原地修改的,我们不能再去创建一个新的数组

其次由于数组存储的特点我们在删除元素的时候,如果删除一个元素以后把后面的元素往前挪,时间复杂度会大很多

这个时候就要用到我们的双指针了,也是和链表中写到的快慢指针用法类似

同样关注不重复的时候,如何操作

image-20220906152144099

class Solution {
    public int removeDuplicates(int[] nums) {
        // 考虑空数组的运行结果
        if(nums.length==0) return 0;
        int slow=0, fast = 0;
        while(fast<nums.length) {
            // 不重复
            if(nums[fast]!=nums[slow]){
                slow++;
                nums[slow]=nums[fast];
            }
            // 重复
            fast++;
        }
        return slow+1;
    }
}

贴下代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值