链接附上,便于查阅
有序数组的平方
关键要点:双指针思想 + 理解非递减的意义
非递减顺序
要正确理解题目的含义,我们才能正确的思考解题方法。非递减顺序用一句话来说,就是:数列中的每一个数都大于等于它前面的那个数。而我们常说的递增数列,则是要求数列中的每一个数都大于它前面那个数才行。
双指针思想
与704的二分查找类似,鉴于非递减顺序左侧为最小值,右侧为最大值,平方后一定会出现整个数列每个数平方后的最大值,因此我们在数组两侧使用双指针。通过不断比较两端的数值大小,逐步排列出整个数组。
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size());
/*个人疏漏,没有给result一个初始化空间,
但是在循环中直接使用 result[k] 对其进行赋值。这会导致访问越界并引发运行时错误。*/
int k = nums.size() - 1;
//一开始对k理解的还不好,还给k赋值为0,说明对思想还没掌握的足够透彻
for (int left_min = 0, right_max = nums.size() - 1; left_min <= right_max; ) {
if (nums[left_min] * nums[left_min] > nums[right_max] * nums[right_max]) {
result[k] = nums[left_min] * nums[left_min];
k--;
left_min++;
}
else
{
result[k] = nums[right_max] * nums[right_max];
k--;
right_max--;
}
}
return result;
长度最小的子数组
关键概念:滑动窗口
拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
可以通过这个视频了解滑动窗口的概念,引用下方评论区老哥的一句话来作总结:
滑动窗口本质上也是一种双指针法,是在充分理解题目的情况下,暴力算法的一种简化。 这道题之所以可以使用滑动窗口,很重要的一个原因是,在移动终止位置的时候,初始位置是不可逆的,初始位置只可能往后移动,而不用每次都从第零个元素开始。 所有双指针法,都是充分利用题目的一个隐藏的特征,来对暴力算法的一种简化。
这一段说的相当好,在这两天学习做题的过程中,老师也在不断提及双指针思想的概念,让我开始思考是否能用双指针思想解决大多数数组题目——目前还写不出来,预计日后补完
个人疏漏
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int begin = 0;
int result = INT32_MAX; // 初始化为最大整数值
for (int end = 0; end < nums.size(); end++) {
sum += nums[end];
while (sum >= target) {//这里有疏漏,一开始没写等于的情况,事实上,如果不加等于就会漏解了
int length_vector = end - begin + 1;
result = min(result, length_vector);
sum -= nums[begin];
begin++;
}
}
return result == INT32_MAX ? 0 : result;
}
螺旋矩阵
麻了,初步上手正是有点手足无措,经过老师拆解后才发现有迹可循,本质为n/2个半开半闭的二分查找问题,个人建议先观看视频了解思路。
一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
先写到这,剩下的打完卡继续写