提示:DDU
题目
刷算法的第一天,使用csdn记录的第一天。
一、二分查找
需要注意区间的问题。
左闭右开,左闭右闭。
记住一个就可以,第二个对我来说比较好记。
class Solution
{
public:
int search(vector<int> &nums, int target)
{
int l = 0, r = nums.size();
while (l <= r) //主要的区别也是这里,注意区间里面的所有元素是否可以取到。
{
int mid = (l + r) / 2;
if (target > nums[mid]){
l = mid + 1;
}else if (target < nums[mid]){
r = 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++) { //注意这里的j的取值和数组的范围。
nums[j - 1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
- 时间复杂度:O(log n)
- 空间复杂度:O(log 1)
二、有序数组的平方
也是利用到了双指针(快慢指针),大概理解就是一个用来读,一个用来写。
class Solution
{
public:
vector<int> sortedSquares(vector<int> &nums)
{
int k = nums.size() - 1;
vector<int> result(nums.size(), 0);
for (int i = 0, j = nums.size() - 1; i <= j;)
{
if (nums[i] * nums[i] < nums[j] * nums[j])
{
result[k--] = nums[j] * nums[j];
j--;
}
else
{
result[k--] = nums[i] * nums[i];
i++;
}
}
return result;
}
};
// @lc code=end
总结
题目:今天的题目都理解了。
感受:希望通过训练营可以倒逼自己一把,从今天开始,为期两个月的刷题,每天都要有一点收获,也许不多,但一定要有。加油,你可以的。(后面整理一个模版,写一下每天的收获与反思吧。)