【leetocde】(有序数组/链表中去重:快慢指针)26. 删除有序数组中的重复项 83. 删除排序链表中的重复元素、27. 移除元素、283. 移动零

有序数组/链表中去重

题目:26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)

数组问题中比较常见且难度不高的的快慢指针技巧,是让你原地修改数组。

思路:

题干说在原地修改输入数组 ,可以考虑遍历数组,遍历重复项不做改变,遍历到不重复项对其移动到之前的重复项;

对于该有序数组,可以使用快慢指针的技巧,让slow和fast指针同时指向头节点,fast走在前面,

如果发现一个不重复的元素就告诉slow,让slow前进一步,平且交换元素

如果发现重复元素,slow不变

fast继续前进

代码如下:

复制代码
class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if(n==0){
            return 0;
        }
        int slow = 0,fast = 0;
        while(fast<n){
            if(nums[fast] != nums[slow]) {
                slow++;
                nums[slow] = nums[fast];
            }
            fast++;
        }

        return slow+1;

    }
}
复制代码

 同理在

题目:83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)

代码:

复制代码
/**
 * 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 || head.next == null) return head;

        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null){
            if(fast.val != slow.val){
                slow = slow.next;
                slow.val = fast.val;
            }
            fast = fast.next;
        }
        slow.next = null;

        return head;

    }
}
复制代码

 题目:27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)

代码:

如果 fast 遇到值为 val 的元素,则直接跳过,否则就赋值给 slow 指针,并让 slow 前进一步。

复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
         int n = nums.length;
        if(n==0){
            return 0;
        }
        int slow = 0,fast = 0;
        while(fast<n){
            if(nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;


    }
}
复制代码

注意这里和有序数组去重的解法有一个细节差异,我们这里是先给 nums[slow] 赋值然后再给 slow++,这样可以保证 nums[0..slow-1] 是不包含值为 val 的元素的,最后的结果数组长度就是 slow

 

题目:283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)

思路:与上题类似,相当于去掉所有的元素0,然后再其余数组位置元素赋值为0

代码:

复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        int fast = 0,slow =0;
        while(fast<nums.length){
            if(nums[fast] != 0){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }

        while(slow<nums.length){
            nums[slow] = 0;
            slow++;
        }
    }

   
}
复制代码

 

posted @   MintMin  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示