打卡第一天,回顾C知识的同时学习C++语法
1、二分查找
主要问题点:left和right更新middle时需注意越界问题,语法熟练度问题(理解(right - left) >> 1
、类与函数的使用等),后续应给足合理注释,是需要二刷的题目。
#include <iostream>
#include <vector>
using namespace std;
class Solutionclose {
public:
int search(vector<int> &nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (nums[middle] > target) {
right = middle - 1;
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
};
class Solutionopen{
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while (left < right) {
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
};
int main() {
vector<int> nums = {-1, 0, 3, 5, 9, 12, 15};
int target = 5;
Solutionclose solclo;
int indexc = solclo.search(nums, target);
if (indexc != -1) {
cout << "Target found at index: " << indexc << endl;
} else {
cout << "Target not found in the vector." << endl;
}
Solutionopen solop;
int indexo = solop.search(nums, target);
if (indexo != -1) {
cout << "Target found at index: " << indexo << endl;
} else {
cout << "Target not found in the vector." << endl;
}
return 0;
}
2、移除元素
暴力法
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--;//注意数组更新后移动前的元素在移动后下标都-1,一级注意此句的位置
size--;
}
}
return size;
}
};
双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int slow = 0;
for(int fast = 0 ; fast < size ; fast++ ){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;//不碰到需删除的元素时,slow和fast一起移动,否则不动。因此放在if中
}
}
return slow;
}
};
个人理解表述:fast用于遍历目标数组时判断下标为fast的元素是否与val(即需删除的元素)相同。slow表示更新目标数组到了何处。如果nums[fast]不是要被删除的元素,则slow把nums[fast]更新到slow指向的位置,并与fast一起移动。如果nums[fast]是需要被删除的元素,则此次循环仅fast移动,slow不动,跳过此次fast指向的元素(即需删除的元素),也就跳过了slow更新数组的这一步。
运行问题:几个符号没用英文,注意习惯。