数组:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977. 有序数组的平方 - 力扣(LeetCode)

209. 长度最小的子数组 - 力扣(LeetCode)

59. 螺旋矩阵 II - 力扣(LeetCode)

链接附上,便于查阅


有序数组的平方

关键要点:双指针思想 + 理解非递减的意义

非递减顺序

要正确理解题目的含义,我们才能正确的思考解题方法。非递减顺序用一句话来说,就是:数列中的每一个数都大于等于它前面的那个数。而我们常说的递增数列,则是要求数列中的每一个数都大于它前面那个数才行。

双指针思想

与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

先写到这,剩下的打完卡继续写

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值