代码随想录60天训练营打卡
day 1 第一章数组
今日任务
数组理论基础,704. 二分查找,27. 移除元素
数组理论基础:
数组:存放在连续内存空间上的相同类型数据的集合(下标从0开始)
增删改查
#include<iostream>
#include<vector>
using namespace std;
vector<int> nums(5,0);
void main() {
//1:增
//在数组的末尾添加元素
nums.push_back(1);
nums.push_back(2);
for (int i = 0; i < nums.size(); i++) {
cout << nums[i];
}// 0000012
cout << endl;
//在指定index增加一个元素,vector需要用到的是迭代器
vector<int> ::iterator pos = find(nums.begin(), nums.end(), 1);//找到1所在的位置,在这个位置前面插入
nums.insert(pos, -1);
for (int i = 0; i < nums.size(); i++) {
cout << nums[i];
}
cout << endl;
//2:删除
//在末尾删除:
nums.pop_back();
//删除指定元素:(注意删除最后一个元素时候容易导致失效,所以最后一个的删除用pop_back())
vector<int> ::iterator pos_delete = find(nums.begin(), nums.end(), -1);
nums.erase(pos_delete);
for (int i = 0; i < nums.size(); i++) {
cout << nums[i];
}
//3:改即找到
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0)
cout << nums[i];
}
}
704 二分查找
自己写的还是出错了
1:终止条件是 while( l <= r) ,写成了 for的nums遍历,
二分的基本原理就是不断缩小 l r
2:边界的理解
class Solution {
public:
int search(vector<int>& nums, int target) {
//二分查找
int l = 0;
int r = nums.size()-1;
while(l <= r ){
int mid = l + (r - l) /2 ;
if(nums[mid] > target){
r = mid -1;
}else if(nums[mid] < target){
l = mid +1;
}else{
return mid;
}
}
return -1;
}
};
27 移除元素
双指针:判别快慢指针分别应该指向什么
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针,
//一个fast指向要删除元素,如果不等于val 则赋值
//等于则只把fast++(在for中加过了)
int fast = 0;
int slow = 0;
for(int fast = 0 ; fast < nums.size(); fast ++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};