• 从零上手双指针


    先分享一个很有意思的视频 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    贴下代码

  • 相关阅读:
    用pymysql封装项目通用的连接和查询
    史上最全 1000 道 Java 高频题:集合、IO 流、多线程、网络、算法、Git、设计模式、springboot
    App Store上线规范及流程
    支持向量机 (SVM) 算法详解
    Linux主机连接腾讯云服务器
    未来市场对Java的需求高吗?
    Linux-SUID提权
    外汇天眼:外汇投资入门知识炒汇者的心理误区有哪些?
    智能文档处理黑科技,拥抱更高效的数字世界
    unity Newtonsoft.Json通过字段名直接读取字段值
  • 原文地址:https://blog.csdn.net/qq_39007838/article/details/126726225