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
相关推荐
雾里看山1 小时前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
像风一样自由20203 小时前
HTML与JavaScript:构建动态交互式Web页面的基石
前端·javascript·html
大千AI助手3 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
浪裡遊3 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
好好研究3 小时前
学习栈和队列的插入和删除操作
数据结构·学习
YuTaoShao4 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
生态遥感监测笔记5 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
Tony沈哲5 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
Liudef065 小时前
2048小游戏实现
javascript·css·css3