代码随想录算法训练营第一天
代码随想录算法训练营第一天| 704. 二分查找、27.移除元素、977.有序数组的平方
704.二分查找
暴力法,耗时3:05
class Solution {
public:
int search(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++){
if(nums[i] == target){
return i;
}
}
return -1;
}
};
二分法,耗时10:39
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(right >=left){
int mid = left + (right - left)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid -1;
}else{
return mid;
}
}
return -1;
}
};
主要是边界处理。要么定义为左闭友闭,要么是左闭右开。两种思路写法不同
27.移除元素
暴力法,耗时9:45
一开始没有让int size = nums.size();,然后超时了。
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--;
size--;
}
}
return size;
}
};
双指针法:
看了解析之后写的,耗时2:02,目前是懂了双指针的思想了
快指针用来搜寻元素,慢指针用来更新数组下标位置。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastInddex = 0 ; fastInddex < nums.size() ; fastInddex ++){
if(nums[fastInddex] != val){
nums[slowIndex ++] = nums[fastInddex];
}
}
return slowIndex;
}
};
977.有序数组的平方
暴力法一下子就做出来了。
双指针法,看了解析
一个指针从前往后,一个指针从后往前
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};
今天到这。
代码随想录算法训练 文章被收录于专栏
代码随想录算法训练

查看13道真题和解析