//27.移除元素
/*
给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
*/
/*
方法一:两层for循环
时间复杂度:O(n2) 空间复杂度:O(1)
*/
class Solution {
public int removeElement(int[] nums, int val) {
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] == val) { //如果找到了目标值
for (int j = i; j < len - 1; j++) {
nums[j] = nums[j + 1]; //从i开始,后面的元素往前更新,其实就是删除掉这个元素
}
len--; //每进行一次内层循环,说明找到了一个目标值,数组长度-1
i--; //i返回到原来位置,考虑连续都是目标值的情况
}
}
return len;
}
}
/*
方法二:双指针1:头尾指针
头指针遍历,遇到val再看尾指针;如果尾指针也是val,len--,尾指针向前移动
如果尾指针不是val,头尾指针元素交换,len--,头指针向后移动,尾指针向前移动
时间复杂度O(n) 空间复杂度O(1)
*/
class Solution1 {
public int removeElement(int[] nums, int val) {
int len = nums.length;
int head = 0;
int end = len - 1;
while (head <= end) {
if (nums[head] != val) {
head++;
} else {
if (nums[end] != val) {
nums[head] = nums[head] ^ nums[end];
nums[end] = nums[head] ^ nums[end];
nums[head] = nums[head] ^ nums[end];
head++;
}
end--;
len--;
}
}
return len;
}
}
/*
方法三:双指针,快慢双指针
快指针遍历数组,如果不等于val,把这个数移动到慢指针位置
如果等于val,快指针自己向后移动
*/
class Solution2 {
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0;
while (fast < nums.length) {
if (nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
代码随想录leetcode刷题Day12-双指针
最新推荐文章于 2024-10-05 12:29:44 发布