移除数组元素
数组移除元素,并不是删除数组元素,而是覆盖元素,元素被覆盖之后,数组容量会相应减少。
1.暴力解法
使用两个for循环进行暴力求解,外层for循环遍历数组元素找出val元素,内层for循环更新数组元素。
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--;
}
}
return len;
}
}
在for循环中判断条件是小于更新后的数组长度,若是使用原始长度,则会陷入死循环。
2.双指针解法(必会的方法)
使用两个指针fast和slow,fast指针用来遍历数组,寻找新数组元素,slow指针指向新数组末尾的后一位(为新数组元素加入留个位置)。当fast指针找到新数组元素时,将新数组元素赋值给slow指针所指向的位置,接着slow指针往后移动一位,数组长度加一。直到找到所有新数组元素。
class Solution {
public int removeElement(int[] nums, int val) {
int fast,slow = 0;
int len = nums.length;
for(fast = 0;fast<len;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
}
二分查找
二分查找在于将搜索区间不断缩小,直到找到目标元素。这里区间的边界是容易出问题的点
左闭右闭区间
class Solution {
public int search(int[] nums, int target) {
int start = 0;
int end = nums.length;
while(start<=end){
int mid = start+(end-start)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]<target){
start = mid+1;
}
else {
end = mid-1;
}
}
return -1;
}
}
左闭右开
class Solution {
public int search(int[] nums, int target) {
int start = 0;
int end = nums.length;
while(start<end){
int mid = start+(end-start)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]<target){
start = mid+1;
}
else {
end = mid;
}
}
return -1;
}
}