算法刷题Day2 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

目录

  • 0 引言
  • 1 有序数组列表
    • 1.1 我的题解(双指针)
    • 1.2 根据官方解题修改后
  • 2 长度最小的子数组
    • 2.1 我的题解
    • 2.2 官方滑动窗口(双指针)题解
  • 3 螺旋矩阵
    • 3.1 我的题解

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

1 有序数组列表

  • 🎈 文档讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
  • 🎈 视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep
  • 🎈 做题状态:没有抓住顺序排序的精髓,导致解题思路不明确。现在知道双指针不仅可以从一头遍历,也可以同时从两头遍历

1.1 我的题解(双指针)

这道题主要利用了数组顺序排序的特性,基于此可以得知数组平方后的最大数一定在数组的两端。所以只需要从两端开始比较找出最大的数,然后插入到新数组的最后一位即可得到排序好的新数组。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {// 平方后的数肯定大于等于0vector<int> result;int leftIndex, rightIndex;leftIndex = 0; rightIndex = nums.size() - 1;// 双指针法基于数组非递减顺序的特点,可知平方后的最大数在数组的两端// 所以从两头往中间遍历依次把最大数插入到新的数组中,即可得到答案。while (leftIndex <= rightIndex){// 当左侧数的绝对值更大时插入左侧的数据,leftIndex加一if (abs(nums[leftIndex]) >= abs(nums[rightIndex])){result.insert(result.begin(), abs(nums[leftIndex] * abs(nums[leftIndex])));leftIndex++;}// 当右侧数的绝对值更大时插入右侧的数据,rightIndex减一else{int temp = abs(nums[rightIndex] * abs(nums[rightIndex]));result.insert(result.begin(), temp);rightIndex--;}}return result;}
};

1.2 根据官方解题修改后

但是我这个题解还有很多不足的地方,例如新数组的插入操作,使用的是Insert,这个函数的时间复杂度是 n,因为是从头插入新的元素,所以每次都会导致其他元素全部向后移动一位。

通过官方题解,可以得知。直接将新数组元素个数确定,然后采用索引的方式从后往前给新数组赋值,这样可以节省很多的时间。

class Solution {
public:vector<int> sortedSquares2(vector<int>& nums) {// 平方后的数肯定大于等于0int leftIndex, rightIndex, insertIndex;leftIndex = 0; insertIndex = rightIndex = nums.size() - 1;vector<int> result(nums.size());while (leftIndex <= rightIndex){if (abs(nums[leftIndex]) >= abs(nums[rightIndex])){result[insertIndex] = abs(nums[leftIndex] * abs(nums[leftIndex]));leftIndex++;}else{result[insertIndex] = abs(nums[rightIndex] * abs(nums[rightIndex]));rightIndex--;}insertIndex--;}return result;}
};

2 长度最小的子数组

  • 🎈 文档讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
  • 🎈 视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
  • 🎈 做题状态:不看视频和文档直接写出来了(因该还是学习了之前的双指针思想有所启发),但是代码还是有很多地方需要优化

2.1 我的题解

主要就是通过左右两个索引来对该范围内的数组进行相加统计。但是我的代码存在很多特殊条件的判断,不够精简。

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int result = nums.size() + 1, leftIndex = 0, rightIndex = 0;int sum = nums[0];// 当rightIndex大于数组长度时才结束遍历while (rightIndex < nums.size() && leftIndex < nums.size()){ // 当sum的合小于目标值,rightIndex加一if (sum < target){rightIndex++;if (rightIndex >= nums.size()){// 处理特殊情况if (result == nums.size() + 1){return 0;}return result;}sum = sum + nums[rightIndex];}// 当sum大于等于target时,将result和 (rightIndex-leftIndex)+1 作比较,取最小的值// 此时leftIndex要减一else{result = min(result, rightIndex - leftIndex + 1);// 如果result等于1时,直接返回if (result == 1) return result;// 先减去左边索引的值,然后在将坐标索引向右移动一位sum = sum - nums[leftIndex];leftIndex++;}}// 处理特殊情况if (result == nums.size() + 1){return 0;}return result;}
};

2.2 官方滑动窗口(双指针)题解

官方的滑动窗口和我写的有细微区别,但是对于 sum 的操作都是一样,当rightIndex向右移动是需要 sum加,让leftIndex向右移动时,需要sum减去值。

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int result = INT32_MAX;int sum = 0; // 滑动窗口数值之和int i = 0; // 滑动窗口起始位置int subLength = 0; // 滑动窗口的长度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(子序列的起始位置)}}// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列return result == INT32_MAX ? 0 : result;}
};

3 螺旋矩阵

  • 🎈 文档讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
  • 🎈 视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/?vd_source=d499e7f3a8e68e2b173b1c6f068b2147
  • 🎈 做题状态:主要是循环条件的确定需要慢慢调试

3.1 我的题解

  • 思路:根据n来计算需要遍历的圈数,n为1时0圈,n为2时一圈,n为3时一圈。圈数为 n/2 然后取整。然后再根据四个赋值的方向制作四个循环。最后当n为奇数时,需要手动给中间的数赋值。
  • 难点:每次循环时,条件的确定。时刻记住数组的最大的下标和数组元素个数相差1。
class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> result(n, vector<int>(n));int number = 1;int i = 0;// 遍历的圈数确定,圈数 = n/2然后取整 (n为1时0圈,n为2时一圈,n为3时一圈)for ( ; i < n/2; i++){// 每遍历完一圈后,行的区间要从首尾各减去一,列的区间也要从首尾各减去一int j = i;for (j = i; j < (n - i); j++){// 第一行result[i][j] = number;number++;}for (j = i+1; j < (n - i); j++){// 最后一列,n-1 对应最后一列result[j][n - 1 - i] = number;number++;}for (j = i+1; j < (n - i); j++){// 最后一行,从最后一列开始遍历,n-1是最后一列result[n - 1 - i][n - 1 - j] = number;number++;}// 第一列遍历,少一个元素,需要注意for (j = i+1; j < (n - i) - 1; j++){// 第一列,从最后一行向上result[n - 1 - j][i] = number;number++;}}// 当n为奇数时,需要手动给中心点赋值if (n%2 != 0){result[i][i] = number;}// 遍历完后返回结果return result;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE_自适应布局-postcss-pxtorem,nuxt页面自适配

postcss-pxtorem是一个PostCSS插件&#xff0c;用于将CSS中的像素值转换为rem单位&#xff0c;以实现响应式布局和适配不同屏幕尺寸的需求。 它的适配原理是将CSS中的像素值除以一个基准值&#xff0c;通常是设计稿的宽度&#xff0c;然后将结果转换为rem单位。这样&#xff0…

【MySQL】lower_case_table_names作用及使用

知识点&#xff1a; lower_case_table_names 是mysql设置大小写是否敏感的一个参数。 场景&#xff1a;在使用dataease时&#xff0c;连接外部数据库&#xff0c;启动报错&#xff01;后查看官方文档&#xff0c;特别要求改数据库配置文件&#xff1a;lower_case_table_names …

让照片说话唱歌的软件,盘点这3款!

在数字时代&#xff0c;我们总是渴望找到新的方式来表达自我、分享生活。近年来&#xff0c;随着人工智能和图像处理技术的飞速发展&#xff0c;一种新型的软件应运而生&#xff0c;它们能够让照片“说话”甚至“唱歌”&#xff0c;给我们的生活带来了无限乐趣和创意空间。那么…

专题1 - 双指针 - leetcode 15. 三数之和 - 中等难度

leetcode 15. 三数之和 - 点击直达 leetcode 15. 三数之和 中等难度 双指针1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 15. 三数之和 中等难度 双指针 1. 题目详情 给你一个整数数组 nums &#…

驱动开发面试复习

创建字符设备 1 创建设备号 alloc_chrdev_region 2.创建cdev cdev_init 3.添加一个 cdev,完成字符设备注册到内核 cdev_add 4.创建类 class_create 5.创建设备 device_create 1.内核空间与用户空间数据 copy_from_user 和copy_to_user 俩个函数来完成。 copy_from_user 函数…

如何提高项目成功率?分享20 种项目管理工具、技术和软件

本文将分享20种项目管理常用的工具、技术和软件&#xff0c;比如项目管理软件 PingCode、Worktile、Redmine、Jira、SAP、PrimaveraSystems等&#xff1b;项目计划阶段工具和技术WBS、甘特图、PERT图、风险评估矩阵等等。 项目管理是确保项目成功交付的关键&#xff0c;它涉及到…

Java实现JT/T808以及T/GDRTA002-2020车辆协议对接

简介 JT/T808,道路运输车辆卫星定位系统终端通信协议及数据格式,本标准规定了道路运输车辆卫星定位系统车载终端与监管/监控平台之间的通信协议与数据格式 , 包括协议基础、通信连接、消息处理、协议分类与要求及数据格式。 T/GDRTA002-2020,道路运输车辆智能视频监控报警系…

CCF-B推荐会议 Euro-Par‘24延期10天! 3月25日截稿!抓住机会!

会议之眼 快讯 第30届Euro-Par(International European Conference on Parallel and Distributed Computing)即国际欧洲并行和分布式计算会议将于 2024 年 8月26日-30日在西班牙马德里举行&#xff01;Euro-Par是欧洲最主要的会议之一&#xff0c;提供了一个广泛而综合的平台&a…

vue3中的生命周期有哪些和怎么使用?

目录 前言&#xff1a; 正文&#xff1a; 总结: 前言&#xff1a; Vue.js 3是Vue.js框架的最新主要版本&#xff0c;引入了一些重大的改变和增强。在Vue 3中&#xff0c;由于Composition API的引入&#xff0c;生命周期钩子被替换为生命周期函数。 正文&#xff1a; 以下是…

中大型工厂人员定位系统源码,实现人、车、物的实时位置监控

UWB高精度定位系统源码&#xff0c;中大型工厂人员定位系统&#xff0c;实现人、车、物的实时位置监控 UWB高精度定位系统源码&#xff0c;智慧工厂人员定位系统源码&#xff0c;基于VueSpring boot前后端分离架构开发的一套UWB高精度定位系统源码。有演示。 随着经济的高速发展…

三八妇女节智慧花店/自动售花机远程视频智能监控解决方案

一、项目背景 国家统计局发布的2023年中国经济年报显示&#xff0c;全年社会消费品零售总额471495亿元&#xff0c;比上年增长7.2%。我国无人零售整体发展迅速&#xff0c;2014年市场规模约为17亿元。无人零售自助终端设备市场规模超过500亿元&#xff0c;年均复合增长率超50%。…

2023年全国职业院校技能大赛软件测试赛题第8套

2023年全国职业院校技能大赛 软件测试赛题第8套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 赛项组别: 高等职业教育 …