当前位置: 首页 > news >正文

day02 有序数组平方、长度最小的子数组、螺旋矩阵II

题目链接:leetcode977-有序数组平方,leetcode209-长度最小的子数组, leetcode59-螺旋矩阵II

有序数组平方

解题思路:双指针法,left, right
1)创建一个等长的新数组
2)left从左到右扫描数组,right从右向左扫描数组
3)分别对left和right进行平方,并对平方的结果进行比较,谁大谁放入新数组(从新数组尾部开始存放,因为原始数组是从小到大排序的,如果存在负数,则left执行的val的平方值可能会大于right指向的平方值)
时间复杂度: O(n)
空间复杂度: O(1): 除了存储答案的数组以外,只需要维护常量空间

Go

func sortedSquares(nums []int) []int {numsLen := len(nums)left, right := 0, numsLen-1// 创建新数组ans := make([]int, numsLen)ansIdx := numsLen - 1for left <= right {lS, rS := nums[left]*nums[left], nums[right]*nums[right]if lS >= rS {ans[ansIdx] = lSleft++} else {ans[ansIdx] = rSright--}ansIdx--}return ans
}

Rust

	pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {let (mut left, mut right) = (0usize, nums.len() - 1);let mut ans = vec![0;nums.len()];let mut ans_idx = right;while left <= right {let (l_s, r_s) = (nums[left] * nums[left], nums[right] * nums[right]);// 之所以使用l_s >= r_s, 是为了避免 right-=1(right为0时会报错)// 如:[0, 1, 2, 3], right最小也只是为0, 此时(left=right=0)if l_s >= r_s {ans[ans_idx] = l_s;left += 1;} else {ans[ans_idx] = r_s;right -= 1;}// ans_idx是usize类型if ans_idx == 0 {break}ans_idx -=1;}ans}

长度最小的子数组

解题思路:滑动窗口,双指针: l,r
1) 找到sum>=target的连续子数组,确保[l, r]范围内的val的sum>=target, r-l+1即为sum>=target的连续子数组的长度
2)移动l, 在满足sum >= target的前提下,缩小[l, r]的范围,持续移动l, 求最小的r-l+1
时间复杂度: O(n)
空间复杂度: O(1)

Go

func minSubArrayLen(target int, nums []int) int {l, r, numsLen := 0, 0, len(nums)minLen := numsLen + 1 // 设置初始长度为最大长度sum := 0for ; r < numsLen; r++ {sum += nums[r]for sum >= target {curLen := r - l + 1if curLen < minLen {minLen = curLen}// 缩小[l, r]的范围sum -= nums[l]l++}}// minLen等于numsLen+1说明没有发生任何变化,即没有找到minLenif minLen == numsLen+1 {return 0}return minLen
}

Rust

	pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {// 给min_len一个默认大小let (mut l, mut min_len,mut sum)  = (0usize, nums.len()+1, 0);for r in 0..nums.len() {sum += nums[r];// 在满足sum >= target的前提下,缩小[l, r]的范围while sum >= target {let cur_len = r - l + 1;if cur_len < min_len {min_len = cur_len;}// 移动lsum -= nums[l];l += 1;}}// min_len 等于默认值,说明min_len没有发生变化,说明没有找到最小连续子数组if min_len == nums.len() + 1 {return 0;}min_len as i32}

螺旋矩阵II

解题思路:模拟题,画图思考

Go

func generateMatrix(n int) [][]int {// cycleNum: 要转的圈数// lineNo: 行号// columnNo: 列号// layerNo: 当前层数cycleNum, lineNo, columnNo, layerNo := n/2, 0, 0, 1// 初始化矩阵matrix := make([][]int, n)for i := 0; i < n; i++ {matrix[i] = make([]int, n)}// 计数器,每经过一个格子进行累加counter := 1for i := 0; i < cycleNum; i++ {// 左-->右,行不变,列累加for columnNo < n-layerNo {matrix[lineNo][columnNo] = countercounter++columnNo++}// 上--->下,列不变,行累加for lineNo < n-layerNo {matrix[lineNo][columnNo] = countercounter++lineNo++}// 右--->左, 行不变,列减小for columnNo >= layerNo {matrix[lineNo][columnNo] = countercounter++columnNo--}// 下--->上,列不变,行减小for lineNo >= layerNo {matrix[lineNo][columnNo] = countercounter++lineNo--}// 此时lineNo和columnNo都等于layerNum-1layerNo++lineNo++columnNo++}// 如果n为奇数,则最中心会空出来,即matrix[n/2][n/2]=n^2if n&1 == 1 {matrix[n/2][n/2] = n * n}return matrix
}

Rust

pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> {// cycle_num: 要转的圈数// line_no:行的标号// column_no: 列的标号// layer_no: 当前在第几层let n_usize = n as usize;let (cycle_num, mut layer_no) = (n/2, 1usize);let (mut line_no, mut column_no) = (0usize, 0usize);// 累加器let mut counter = 1;// 初始化矩阵let mut matrix = vec![vec![0;n as usize];n as usize];for i in 0..cycle_num {// 左--->右,行不变,列累加while column_no < n_usize - layer_no {matrix[line_no][column_no] = counter;counter += 1;column_no += 1;}// 上--->下,列不变,行累加while line_no < n_usize - layer_no {matrix[line_no][column_no] = counter;counter += 1;line_no += 1;}// 右--->左,行不变,列减小while column_no >= layer_no {matrix[line_no][column_no] = counter;counter += 1;column_no -= 1;}// 下--->上,列不变,行减小while line_no >= layer_no {matrix[line_no][column_no] = counter;counter += 1;line_no -= 1;}// 此时 line_no和column_no都为 layer_no-1// 等待进入下一层layer_no += 1;line_no += 1;column_no += 1;}if n & 1 == 1 {matrix[n_usize >> 1][n_usize >> 1] = n * n;}matrix}

相关文章:

  • PHP 经纬度相关计算 坐标点之间的距离
  • C++对象模型(一)
  • Linux平台下安全编译
  • Git搭建
  • 通过FileZilla配置FTP
  • gitlab.rb主要配置
  • linux install nvm
  • 如何令containerd连接私有harbor
  • SQL基础知识(四)
  • Golang内置类型和函数及接口、Init函数和main函数
  • 无状态应用管理Deployment
  • 面试经典题---3.无重复字符的最长子串
  • php二次开发股票系统代码:腾讯股票数据接口地址、批量获取股票信息、转换为腾讯接口指定的股票格式
  • 幻兽帕鲁服务器数据备份
  • x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库
  • eclipse(luna)创建web工程
  • ES6语法详解(一)
  • Java读取Properties文件的六种方法
  • JSDuck 与 AngularJS 融合技巧
  • Python_网络编程
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • ubuntu 下nginx安装 并支持https协议
  • 初识MongoDB分片
  • 关于Flux,Vuex,Redux的思考
  • 关于List、List?、ListObject的区别
  • 关于字符编码你应该知道的事情
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • ------- 计算机网络基础
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信公众号开发小记——5.python微信红包
  • 微信小程序填坑清单
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 新书推荐|Windows黑客编程技术详解
  • 一个SAP顾问在美国的这些年
  • 原生Ajax
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 1.Ext JS 建立web开发工程
  • ionic入门之数据绑定显示-1
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #在 README.md 中生成项目目录结构
  • (003)SlickEdit Unity的补全
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (JS基础)String 类型
  • (rabbitmq的高级特性)消息可靠性
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (未解决)macOS matplotlib 中文是方框
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转) Face-Resources
  • (转)jQuery 基础
  • (转)编辑寄语:因为爱心,所以美丽
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net FrameWork简介,数组,枚举
  • .net Signalr 使用笔记