ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeeCode数组问题:原地删除

2022-05-24 21:34:14  阅读:167  来源: 互联网

标签:right nums int fast 原地 LeeCode 数组 指针


LeeCode 27:移除元素

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度length
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

标签:数组、首尾指针

建立模型:

  1. 定义首、尾指针
  2. 首指针向右移动,且当首指针指向的值等于 val时,(交换首尾指针的值,尾指针向左移动)
  3. 重复第2步,直到首指针移动到尾指针的右边

时间复杂度:O(N)

代码实现:

# Python实现
def remove_element(nums: List[int], val: int) -> int:
    left, right = 0, len(nums) - 1
    while left <= right:
        if nums[left] == val:
            nums[left], nums[right] = nums[right], nums[left]
            right -= 1
        else:
            left += 1

    # 由于while循环的条件设置为 i<=j, 所以最后 i 的值始终等于 len(新数组)
    return left
/* Java实现 */
public int remove_element(int[] nums, int val) {
  int left = 0, right = nums.length - 1;
  while (left <= right) {
    if (nums[left] == val) {
      int temp = nums[left];
      nums[left] = nums[right];
      nums[right] = temp;
      right -= 1;
    }
    else {
      left += 1;
    }
  }
  
  return left;
}

LeeCode 26:删除有序数组中的重复项

题目描述:

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

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成

标签:数组、快慢指针

建立模型:

  1. 定义快、慢指针。(快指针指向当前元素,慢指针指向当前插入位置)
  2. 当快指针出现 nums[fast] != nums[fast - 1] ,将快指针指向的当前元素插入慢指针指向的位置,快、慢指针同时向右移动
  3. 当快指针出现 nums[fast] == nums[fast - 1] ,只向右移动快指针
  4. 重复步骤2,3,直至fast == nums.length

时间复杂度:O(N)

代码实现:

# Python实现
def remove_duplicates(nums:List[int]) -> int:
    if not nums:
        return 0
    
    slow, fast = 1, 1
    while fast < len(nums):
        if nums[fast] != nums[fast - 1]:
            nums[slow] = nums[fast]
            slow += 1
        fast += 1
    return slow
/* Java实现 */
int remove_duplicates(int[] nums) {
  if (nums.length == 0){
    return 0;
  }
  
  int slow = 1, fast = 1;
  while (fast < nums.length) {
    if (nums[fast] != nums[fast - 1]) {
      nums[slow] = nums[fast];
      slow += 1;
    }
    fast += 1;
  }
  
  return slow;
}

LeeCode 283:移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

标签:数组、快慢指针

时间复杂度:O(N)

建立模型:

  1. 定义快、慢指针。(快指针指向当前元素,慢指针指向当前插入位置)
  2. 当快指针出现 nums[right] != 0 ,则交换快慢指针的值,快慢指针同时右移
  3. 当快指针出现 nums[right] == 0 ,则只向右移动快指针
  4. 重复步骤2,3,直到 right == nums.length

代码实现:

# Python实现
def move_zeroes(self, nums: List[int]) -> None:
    left, right = 0, 0
    while right < len(nums):
        if nums[right] != 0:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
        right += 1
    return None
/* Java实现 */
public void move_zeroes(int[] nums) {
  int left = 0, right = 0;
  while (right < nums.length) {
    if (nums[right] != 0) {
      int temp = nums[left];
      nums[left] = nums[right];
      nums[right] = temp;
      left += 1;
    }
    right += 1
  }
  
  return;
}

标签:right,nums,int,fast,原地,LeeCode,数组,指针
来源: https://www.cnblogs.com/ylyzty/p/16307229.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有