创建代码仓库
二分查找
题目链接: 704. 二分查找 - 力扣(Leetcode)
实现思路
- 二分查找,找到目标数组中的第一个元素的下标和最后一个元素的下标
- 做一个循环,如果说left<=right就一直查找下去
- 我们将中间值下标在数组中的位置和目标值进行比较。
- 如果说中间值比目标值小,那么我们将数组的后半部分提取出来进行递归操作
- 如果说中间值比目标值大。那么我们将数组的前半部分提取出来进行递归操作
- 最后找到目标值下标位置返回回去。
代码实现
// 闭合区间情况
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int mid=left+((right-left)/2);
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else{
return mid;
}
}
return -1;
}
};
// 左闭右开区间情况
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;
}
};
移除元素
实现思路
- 首先我们便利一遍原数组
- 查找到原数组中的目标值。记住目标值下标
- 将下标后面的元素都往前面位移一位,覆盖掉当前元素
- 将遍历到目标元素值的下标往前移动一位,并继续往后面查找是否还有目标值
- 将所有目标元素覆盖完成之后返回数组长度。
代码实现
// 暴力解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
// 双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex=0,fastIndex=0;
for(;fastIndex<nums.size();fastIndex++){
if(val!=nums[fastIndex]){
nums[slowIndex++]=nums[fastIndex];
}
}
return slowIndex;
}
};