LeetCode中的第27题:
一、暴力解法(T(n)=O(n^2))
1.遍历数组
2.判断是否匹配
3.更新数组
4.解决bug1:当更新数组后(即后面的数相继覆盖了nums[i],但更新后的nums[i]实际上是未更新前到的nums[i+1]。)nums[i]就未判断到。
解决:j--
5.数组更新后,数组长度-1。
(解决bug2:令j=i+1解决了循环内边界问题,在不需要考虑数组中超出新长度后面的元素的情况下,可直接将长度--即可)
class Solution {
public int removeElement(int[] nums, int val) {
int length=nums.length;
for(int i=0;i<length;i++){
if(nums[i]==val){
for(int j=i+1;j<length;j++){
nums[j-1]=nums[j]
}
j--;
length--;
}
}
}
}
二、双指针法(快慢指针法)
快指针:寻找新数组的元素,新数组就是不含有目标元素的数组
慢指针:指向更新新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
// 快慢指针
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
if (nums[fastIndex] != val) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}