LeeCode数组问题(一)

2023-06-25,

LeeCode 27:移除元素

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度length

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

标签:数组、首尾指针

建立模型:

    定义首、尾指针
    首指针向右移动,且当首指针指向的值等于 val时,(交换首尾指针的值,尾指针向左移动)
    重复第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) 额外空间的条件下完成

标签:数组、快慢指针

建立模型:

    定义快、慢指针。(快指针指向当前元素,慢指针指向当前插入位置)
    当快指针出现 nums[fast] != nums[fast - 1] ,将快指针指向的当前元素插入慢指针指向的位置,快、慢指针同时向右移动
    当快指针出现 nums[fast] == nums[fast - 1] ,只向右移动快指针
    重复步骤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)

建立模型:

    定义快、慢指针。(快指针指向当前元素,慢指针指向当前插入位置)
    当快指针出现 nums[right] != 0 ,则交换快慢指针的值,快慢指针同时右移
    当快指针出现 nums[right] == 0 ,则只向右移动快指针
    重复步骤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;
}

LeeCode数组问题(一)的相关教程结束。

《LeeCode数组问题(一).doc》

下载本文的Word格式文档,以方便收藏与打印。