LeetCode 977.有序数组的平方

本题主要使用的是双指针法,并且需要开辟一个新的数组。当然最简单的方法就是原地相乘,然后使用vector容器的sort方法即可。
这里额外复习一下vector容器的一些基础内容:

  • 常用的初始化:
vector<int> v1 = v2;
vector<int> v1(v2); //两者等价
vector<int> v1(n,val) //n个值为val的初始化
  • 常用的函数:
vector<int> v;
v.push_back(i); //在尾部添加元素
v.insert(pos,val); //在指定位置添加元素,位置为迭代器变量
v.pop_back(); //删除尾部元素
v.erase(pos1,pos2) //删除pos1-pos2的元素,位置为迭代器变量

本题使用双指针法的主要思路就是让指针从两边行进,判断存在负数情况下平方之后与正数平方的大小,然后从末尾插入新数组中。
下面给出代码:

class Solution {public:vector<int> sortedSquares(vector<int>& nums) {vector<int> res(nums.size(),0);int k = nums.size() - 1;for(int left = 0,right = nums.size() - 1; left <= right; ){if(nums[left] * nums[left] < nums[right] * nums[right]){res[k--] = nums[right] * nums[right];right--;}else{res[k--] = nums[left] * nums[left];left++;}}return res;}
};

需要注意的点是,操作新容器时,直接使用数组类型的访问和赋值方式会让运行速度更快。

LeetCode 209. 长度最小的子数组

本题唯一需要注意的地方是处理满足条件target时对子序列的处理,即:当处理完子序列使其不满足target条件时再进入下一次循环。主要方法也是双指针法(滑动窗口),只要想清楚窗口左右滑动时的条件,基本框架就可以写出来了,需要注意一些细节。
下面给出我自己写的代码:

 int minSubArrayLen(int target, vector<int>& nums) {int ans = nums.size() + 1;int sum = 0;for(int left = 0 , right = 0;right <= nums.size() - 1; ){sum += nums[right];if(sum < target){right++;continue;}else{//关键点是需要有这个while逻辑while(sum >= target){ans = ans > right - left + 1 ? right - left + 1 : ans; sum -= nums[left++];}right++;}}if(ans == nums.size() + 1) return 0;return ans;}

卡哥的代码比较简洁,省略了if逻辑:

         for (int j = 0; j < nums.size(); j++) {sum += nums[j];// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件while (sum >= s) {subLength = (j - i + 1); // 取子序列的长度result = result < subLength ? result : subLength;sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)}}

并且在输出上做了一定的处理:

int result = INT32_MAX;
return result == INT32_MAX ? 0 : result;

LeetCode 59.螺旋矩阵 II

本题还是有一定难度的,了解区间不变原则之后,代码中很多细节还是不太好处理,磕磕绊绊才写出来。本题使用左闭右开我觉得比较好理解,下面直接给出代码:

class Solution {public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans(n,vector<int>(n,0));int x = 0, y = 0;int count = 1;int boundary= 1;int loop = n/2;while(loop){int start = boundary - 1;for(; x < n - boundary; x++){ans[y][x] = count++;}for(; y < n - boundary; y++){ans[y][x] = count++;}for(; x > start; x--){ans[y][x] = count++;}for(; y > start; y--){ans[y][x] = count++;}x++;y++;boundary++;loop--;}if(n%2 == 1){ans[n/2][n/2] = n * n;}return ans;}
};

需要注意的点:

  • 需要有一个offset来控制区间的范围
  • 需要分奇偶情况,对奇数情况单独处理
  • 二维vector的初始化vector<vector<int>> ans(n,vector<int>(n,0));

数组总结

最后简单说下我认为c++中数组需要注意的地方:

  • 数组内存是连续的,二维数组也一样
  • 不能删除元素,删除的手法只能是覆盖

代码随想录第二天 leetcode 977、209、59相关推荐

  1. 代码随想录第二十五天|组合、电话号码的字母组合

    代码随想录第二十五天|216.17不熟 Leetcode 216. 组合总和 III Leetcode 17. 电话号码的字母组合 Leetcode 216. 组合总和 III 题目链接: 组合总和 ...

  2. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  3. 代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II

    LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...

  4. 代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、​LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II

    LeetCode 977.有序数组的平方 双指针法:数组其实是有序的, 只不过负数平方之后可能成为最大数了.那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间.此时可以考虑双指针法 ...

  5. 代码随想录第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

    (本文主要是用于个人笔记的书写,很多地方的使用可能并不专业,如需学习更加建议移步代码随想录官网代码随想录 (programmercarl.com))) 1.有序数组的平方: ----双指针法:因为平方 ...

  6. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

  7. 代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

    目录 一.今日心得感悟 1.数组从小到大排序 ①冒泡法--时间复杂度:O(nlogn) ②使用排序函数qsort--时间复杂度:O(nlogn) ③两端->中间(双指针法) --时间复杂度:O( ...

  8. 代码随想录第二天 |LeetCode977.有序数组的平方,LeetCode209.长度最小的子数组,LeetCode59.螺旋矩阵II

    LeetCode977.有序数组的平方 977. 有序数组的平方 - 力扣(LeetCode) 暴力解法: 一开始不习惯用双指针解法,习惯性先平方再用双指针,发现做不出了HH.于是愉快的用传统暴力解法 ...

  9. 【代码随想录】【LeetCode】自学笔记07 - 栈和队列

    总结 基础补牢:[https://blog.csdn.net/tham_/article/details/44733101] 根据[http://c.biancheng.net/view/3354.h ...

  10. 【代码随想录】【LeetCode】学习笔记04-哈希表

    前言 哈希法牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找. 如果遇到需要判断一个元素是否出现过的场景,应该第一时间想到哈希法! 四个常见哈希表类型对 ...

最新文章

  1. 51CTO让我成长【我与51CTO的故事】
  2. 解决IDEA中,maven依赖不自动补全的问题
  3. pip is configured with locations that require TLS/SSL 解决
  4. 【Network Security!】虚拟化架构与系统部署
  5. android更改menu字体颜色,Android动态修改menu颜色
  6. [转]Muilti-touch 双指缩放的实现探索
  7. ubuntu命令查询版本和内核版本
  8. 落地即王道,锁死企业智变CP——云+AI
  9. 光凭 5G 根本无法解决宽带问题!
  10. Hosts文件与钓鱼网站
  11. ukey网络连接异常_连接UKEY设备失败如何解?电子支付OCX – 手机爱问
  12. IE白屏修复,vue 兼容IE
  13. android手机设置固定dns,安卓手机修改WiFi DNS设置的方法
  14. 【C++】error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]
  15. html rtf转换,如何使用JavaScript将HTML转换为RTF
  16. java(spring boot)通过exchange邮箱发送邮件
  17. Odoo(OpenERP)应用实践:代发货管理
  18. 关于APP广告位的设计与优化(上)
  19. centos下创建虚拟网卡
  20. Pandas将列表(List)转换为数据框(Dataframe)进阶篇

热门文章

  1. 《Android编程权威指南(第三版)》第五章挑战练习Demo
  2. 局域网联机_七日杀v17.2(B27)版/支持局域网联机/多项修改器/初始存档/局域网联机教程...
  3. 一文了解肠-器官轴,肠好身体好
  4. 网易微专业大数据工程师
  5. Hbase性能测试及优化过程记
  6. php 获取第几周的时间,PHP获取一年有几周以及每周开始日期和结束日期
  7. dedecms如何在首页调用会员信息(会员头像和名字等)
  8. js 流文件下载zip压缩包
  9. 关于装电脑系统的心得总结
  10. 暴走英雄坛服务器维护,《暴走英雄坛》4月29日更新公告