Leetcode 面试150题(三)

一、题目

给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

二、思路

一旦出现原地,基本都要用到双指针。

我们可以使用两个指针来解决这个问题:

  1. 快指针(fast):用于遍历整个数组,找到所有唯一的元素。
  2. 慢指针(slow):用于标记唯一元素的位置,并在原地修改数组。

三、步骤

  1. 初始化两个指针 slowfast,都指向数组的第一个元素。
  2. 遍历数组,使用 fast 指针逐个检查每个元素。
  3. 如果 nums[fast] 不等于 nums[slow],说明找到了一个新的唯一元素,将 nums[slow] 更新为 nums[fast],并将 slow 指针向前移动一位。
  4. 继续移动 fast 指针,直到遍历完整个数组。
  5. 最终,slow 指针的位置加一就是唯一元素的个数 k

① JavaScript代码:

javascript 复制代码
function deleteSame(nums){
    if (nums.length === 0){
        return 0;
    }
    let slow = 0;
    for(let fast = 0; i<nums.length; i++){
        if(nums[fast] !== nums[slow]){
            slow ++;
            nums[slow] = nums[fast];
        }
    }
    return slow + 1;

}

② python代码:

python 复制代码
def deleteSame(nums):
    if not nums:
        return 0
    slow = 0
    for fast in range(len(nums)):
        if nums[fast] != nums[slow]:
            slow += 1
            nums[slow] = nums[fast]
    return slow+1

四、实例

假设我们有一个数组 nums = [1, 1, 2, 3, 3, 4]

  1. 初始状态:slow = 0fast = 1
  2. nums[1] == nums[0]fast 移动到下一个位置。
  3. nums[2] != nums[0]slow 移动到下一个位置,nums[1] = nums[2],此时 slow = 1
  4. nums[3] != nums[1]slow 移动到下一个位置,nums[2] = nums[3],此时 slow = 2
  5. nums[4] == nums[2]fast 移动到下一个位置。
  6. nums[5] != nums[2]slow 移动到下一个位置,nums[3] = nums[5],此时 slow = 3

最终,nums 变为 [1, 2, 3, 4, 3, 4]slow 的值是 3。

由于 slow 指针的值是唯一元素的个数减一,所以唯一元素的个数是 slow + 1 = 4

  • slow 指针的值是唯一元素的个数减一。
  • 为了得到唯一元素的个数,我们需要返回 slow + 1
相关推荐
BillKu几秒前
vue3 字符串排序 localeCompare,确保排序为 “B01“, “B10“, “B2“
前端·javascript·vue.js
月华路2 分钟前
《模型不玄学》第14章 标签、损失与样本权重
人工智能·算法·机器学习
黄金龙PLUS4 分钟前
SPARKLE置换算法的优缺点
算法·网络安全·密码学·哈希算法·同态加密
不会就选b5 分钟前
算法日常・每日刷题--<贪心>3
数据结构·算法·leetcode
ysu_03146 分钟前
03-双链表与循环链表
c语言·数据结构·链表
然我12 分钟前
从 Service 到生命周期:Agent Runtime 的插件内核
前端·javascript·agent
行者全栈架构师13 分钟前
WorkBuddy 实战:把一份 200 页年报变成可上台的投资分析 PPT
人工智能·算法·全栈
微三云生态系统架构师-彭丹27 分钟前
矩阵拼团系统设计:先付款先排队的订单排序与自动返本算法
线性代数·算法·矩阵
@MMiL38 分钟前
基于Keil 的实时参数标定和值观测
算法
用户6919026813391 小时前
Agent 记忆处理机制详解:从变量数据类型到内存模型
javascript·架构