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
相关推荐
JiaWen技术圈4 分钟前
Expo Router 和 React Native 的区别
javascript·react native·react.js
生成论实验室11 分钟前
用事件关系网络重新理解AI(二):损失函数、优化器与深度学习的动力学
数据结构·人工智能·深度学习·算法·语言模型
霍霍的袁17 分钟前
【C++初阶】缺省参数(默认参数)详细讲解
开发语言·c++·算法
计算机安禾23 分钟前
【算法分析与设计】第2篇:计算模型与渐进复杂性分析
算法
生成论实验室29 分钟前
事件、信息荷与六维态势空间——每一个事件都是一次空间的弯曲
人工智能·算法·语言模型·可信计算技术·安全架构
budingxiaomoli34 分钟前
递归,搜索与回溯算法--递归
算法
风味蘑菇干34 分钟前
Stream基础题目
java·算法
a1117761 小时前
动森UI组件(开源 html animal-island-ui )
前端·javascript·ui·开源·html
KaMeidebaby1 小时前
卡梅德生物技术快报|真核蛋白表达信号肽筛选实验全流程复盘
服务器·前端·数据库·人工智能·算法
ljt27249606611 小时前
Vue笔记(六)--响应式
javascript·vue.js·笔记