数组理论基础:数组基础
704. 二分查找
解题思路:使用二分查找法,在定义的有效区间中查找元素,区间定义有两种方式,左闭右开和左闭右闭这两种区间,根据自己的习惯选择。
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开区间
int left = 0;
int right = nums.size();
while (left < right) {
int mid = left + ((right - left) / 2);
if (nums[mid] > target) {
right = mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
};
27. 移除元素
解题思路:
快慢指针法:快指针遍历整个数组里面的元素,查找不需要移除的元素,慢指针记录有效元素的最后一个元素的索引,一旦快指针发现了有效元素就将该元素和慢指针的位置交换,直到快指针遍历完整个数组,返回慢指针就是移除元素后的数组长度。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
nums[slow] = nums[i];
slow++;
}
}
return slow;
}
};
暴力解题法:
使用两层循环遍历数组元素,外层遍历寻找需要移除的元素,内存遍历将需要移除的元素进行覆盖,因为数组是连续空间存储,覆盖一个元素,后面的元素都要进行移动。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int res = nums.size();
for (int i = 0; i < res; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < res; j++) {
nums[j - 1] = nums[j];
}
i--;
res--;
}
}
return res;
}
};