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

这篇博客主要介绍了如何解决LeetCode上的第80题——删除有序数组中的重复项 II。作者提供了详细的解题思路和代码实现,通过记录当前元素在后边出现的数量,判断是否需要移动元素并更新数组。最后返回新的数组长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

在这里插入图片描述

思路

记录当前元素在后边出现的数量
如果小于2,则后移一步
如果大于2,则后移两步,并使后移两步里边的元素相同
移动完毕后用下一个元素代替当前位置的元素


题解

package com.leetcode.code;

import java.util.Arrays;

/**
 * @author: zhangkun@codemao.cn
 * @description:
 * @create: 2021-04-06 17:59
 * @Version 1.0
 **/
public class Code80 {

    public static void main(String[] args) {
//        int[] nums = {0,0,1,1,1,1,2,3,3};
        int[] nums = {1,1,1,2,2,3};
//        int[] nums = {1,1,1,1,2,2,3};
        System.out.println(Arrays.toString(nums));
        System.out.println(removeDuplicates(nums));
        System.out.println(Arrays.toString(nums));
    }

//    记录当前元素在后边出现的数量
//    如果小于2,则后移一步
//    如果大于2,则后移两步,并使后移两步里边的元素相同
//    移动完毕后用下一个元素代替当前位置的元素
    public static int removeDuplicates(int[] nums) {
        int len = nums.length;
        if (len == 0 || len == 1 || len == 2) {
            return len;
        }
//        定义fast,用来向前遍历,fast指向的是下一个不相同的元素
        int fast = 1;
//        定义slow,用来重写重复的元素
        int slow = 0;
//        计数,来表示slow指向的元素的数量
        int sum = 1;

        while (fast < len) {
//            如果fast指向当前元素和上一个元素相同
            if (nums[fast] == nums[fast-1]) {
//                则该元素数量+1,fast后移并且continue
                sum++;
                fast++;
                continue;
            } else {
//                如果fast指向的元素和上一个元素不相同时,则表示和slow指向的元素相同的数量找完了
//                对slow指向的元素数量进行判断
//                如果相同数量为1,则slow向后移动一步
                if (sum < 2) {
                    slow++;
                } else {
//                    如果相同数量大于1
//                    slow的下一个元素需要和slow指向的当前元素相同
                    nums[slow+1] = nums[slow];
//                    slow向后移动两步
                    slow+=2;
//                    重新开始对slow指向的元素进行计数
                    sum = 1;
                }
//                移动后的位置用fast指向的元素代替
                nums[slow] = nums[fast];
                fast++;
            }
        }
//        fast遍历完数组后,需要对sum再进行一次判断
//        如果sum大于1,则表示slow指向的元素数量至少为2个
        if (sum > 1) {
//            slow需醒后移动一步,并且用最后一个元素进行代替
            nums[++slow] = nums[fast-1];
        }
//        由于slow指向的是下标的位置,所以最终数量需要+1
        return slow+1;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难过的风景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值