数组在内存地址中是连续的,不能单独地删除数组中某个元素,只能覆盖
最容易想到的方法:暴力解法
public int removeElement(int [] nums,int val){
int n = nums.length;
for (int i = 0; i <n ; i++) {
//发现需要移除的元素,就将数组集体向前移动一位
if(nums[i]==val){
for (int j = i+1; j <n ; j++) {
nums[j-1] = nums[j];
}
//因为i以后的数值都往前移动了一位,因此i也要向前移动一位
i--;
//数组的大小-1
n--;
}
}
return n;
}
public static void main(String[] args) {
int [] nums = {0,1,2,2,3,0,4,2};
Yichuyuansu yichuyuansu = new Yichuyuansu();
int res=yichuyuansu.removeElement(nums,2);
System.out.println(res);
}
}
时间复杂度:O(n^2)
暴力解法使用了两个for循环,此时可以通过使用双指针的办法优化到一个for循环
方法二:双指针法(快慢指针法)
public int removeElement(int [] nums,int val){
int n = nums.length;
int fastIndex = 0;
int slowIndex = 0;
for (; fastIndex < n; fastIndex++) {
if(nums[fastIndex]!=val){
nums[slowIndex]=nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
public static void main(String[] args) {
int [] nums = {0,1,2,2,3,0,4,2};
Yichuyuansu yichuyuansu = new Yichuyuansu();
int res=yichuyuansu.removeElement(nums,2);
System.out.println(res);
}
}
时间复杂度:O(n)
这篇博客探讨了如何在数组中删除特定元素的问题。首先介绍了暴力解法,即通过遍历数组并在遇到目标元素时移动元素,但这种方法的时间复杂度较高,为O(n^2)。随后,文章提出使用双指针法(快慢指针法)进行优化,将时间复杂度降低到O(n),显著提高了效率。这种方法通过一个快指针找到目标元素,另一个慢指针用于更新无目标元素的新数组。
2550

被折叠的 条评论
为什么被折叠?



