面试经典 150 题——3

文章介绍了如何使用双指针解决LeetCode第26题,即在有序数组中删除重复元素,保持元素顺序。作者提供了两种方法,一种是使用额外的数组记录唯一值,另一种是仅使用双指针,通过移动指针和更新数组来删除重复项。虽然方法二避免了额外空间,但需要额外判断处理特殊情况。

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

1、题目介绍

  • 题目详情【编号26】
  • 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
  • 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。

2、我的思路及代码

class Solution {
    public int removeDuplicates(int[] nums) {
        /**
            方法一:双指针+数组a[n],让数组记录每个唯一值的位置与值,并返回相应值。时O(n),空O(n)。
            方法二:
                1、单纯双指。时O(n),空O(1).
                2、需要辅助变量num值用于计算每个唯一值应该跳跃的次数。
                3、使用前后双指针,front用于定位第一个唯一值,end用于定位重复值。
                4、当end没有再遇到与front相同的值时,令nums[count++] = nums[front],并令front = end。
            注意:这题为有序数组,我使用的是方法二更好,若为无序数组,要么排序再用方法二,或者直接使用方法一.
         */
         int front = 0,end = 0,count = 0,n = nums.length;
         while(++end < n){
            if(end < n && nums[front] != nums[end]){
                nums[count++] = nums[front];
                front = end;
            }
         }
        if(count != 0 && nums[front] != nums[count - 1]){
            nums[count++] = nums[front];
        }
        if(count == 0){
            nums[count++] = nums[front];
        }
        return count;
    }
}

3、官方题解

在这里插入图片描述
在这里插入图片描述

4、结论

  • 我这种解法其实和官方题解意思上可能相差不是特别大,但是我没用快慢双指针,而是使用了普通双指针。
  • 我认为只要找到非重复的数字然后跳跃过去即可,然后使用count来记值。
  • 但是count记值使得我之前设定的front这个指针变得毫无意义,不如只设定end指针即可得到值。
  • 题解中直接确定了数组只有一位数的时候就一定是唯一值,而我没有确定这个规则,导致后面需要用判断来弥补一些错误。
  • 并且我是从前往后比对是否是唯一值或者说是重复值,而题解则是从后往前比较值,这也不用去特意判断数组越界问题,并解决了后续还需要一些弥补的判断来确认最终值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值