27. 移除元素
27. 移除元素
力扣题目链接
我的代码:左右指针交换,O(n)
class Solution {
public int removeElement(int[] nums, int val) {
if (nums.length == 0) {
return 0;
}
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == val) {
count++;
}
}
int l = 0;
int r = nums.length - 1;
while (l < r) {
while (l < nums.length && nums[l] != val) {
l++;
}
while (r > 0 && nums[r] == val) {
r--;
}
if (r > 0 && l < nums.length && l < r && nums[l] == val) {
int temp = nums[r];
nums[r] = nums[l];
nums[l] = temp;
l++;
r--;
}
}
return nums.length - count;
}
}
和我类似的方法:比我的好
class Solution {
public int removeElement(int[] nums, int val) {
// 双指针
int left = 0, length = nums.length, right = length - 1;
// 当left 移动到 right的右侧时说明遍历完成,退出循环
while (left <= right){
// 先把right指针移动到第一个不是val的地方
if(nums[right] == val){
right--;
continue;
}
// 判断left指针的元素是否是val,如果是则将right指针的元素替换过来
// 否则left指针右移
if(nums[left] == val){
nums[left++] = nums[right--];
}else{
left++;
}
}
// 如果nums里都是val,right指针就是-1了;
// 否则需要判断一下right指针的元素是否是val
return right < 0 ? 0 : nums[right] == val ? right : right + 1;
}
}
妙解
public int removeElement(int[] nums, int val) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i] != val) {
nums[count++] = nums[i];
}
}
return count;
}