题目
题目来源:力扣
https://leetcode-cn.com/problems/remove-element/
一、解法一
class Solution {
public int removeElement(int[] nums, int val) {
int fast=0;
int slow=0;
int len=0;
for(slow=0;slow<nums.length;slow++){
if(nums[slow]==val){
fast=slow+1;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow]=nums[fast];
nums[fast]=val;
len++;
break;
}
fast++;
}
}else{
len++;
}
}
return len;
}
}
时间复杂度O(n*n)
空间复杂度O(1)
结果:
二、官方解法
双指针:一个指针指向要处理的位置,一个指针指向下一个需要输出的位置。
将数组前半部分作为结
class Solution {
public int removeElement(int[] nums, int val) {
int n=nums.length;
if(n==0){
return 0;
}
int right;
int left=0;
for(right=0;right<nums.length;right++){
if(nums[right]!=val){
nums[left]=nums[right];
left++;
}
}
return left;
}
}
结果:
时间复杂度O(n)
空间复杂度O(1)
三、双指针的优化
通过观察可以发现上边的双指针存在需要复制元素的操作,如果数组是[1,2,3,4]需要删除的元素是1,那么需要将2,3,4都左移一位。题目中并不要求顺序,所以就有了这个优化。
class Solution {
public int removeElement(int[] nums, int val) {
int n=nums.length;
if(n==0){
return 0;
}
int right=n;
int left=0;
while(right>left){
if(nums[left]==val){
nums[left]=nums[right-1];
right--;
}else{
left++;
}
}
return left;
}
}
结果:
时间复杂度:O(n)
空间复杂度:O(1)