LeeCode数组问题(一)
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;
}