977. 有序数组的平方
类型: #数组
题目: 给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路:因为原数组是带负数的递增顺序,所以最大值不是头就是尾的平方。新建一个和原数组长度一样的空数组 ans
,用双指针 i, j,i 指向原数组 nums
头部,j 指向数组尾部;如果 nums[i]
平方 > nums[j]
平方,则将nums[i]
填入新数组 ans[k]
(k 指向尾部),i++
;反之将 nums[j]
填入ans[k]
。一轮之后 k--
用代码随想录的图说明
实现:
func sortedSquares(nums []int) []int {
n := len(nums)
i, j, k := 0, n-1, n-1
ans := make([]int, n)
for i <= j{
lm := nums[i] * nums[i]
rm := nums[j] * nums[j]
if(lm > rm){
ans[k] = lm
i++
}else{
ans[k] = rm
j--
}
k--
}
return ans
}
209.长度最小的子数组
类型: #数组
题目:给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
思路:使用滑动窗口。窗口起始位置为 i=0
,终止位置跟着 j 在循环中遍历。sum 为窗口中的值之和,result 为窗口长度,初始值为 len(nums)-1
。在遍历数组的过程中,窗口滑动,将当前值加入 sum 中。如果 sum > target
,则判断目前窗口内元素数量是否为最小值,主要是记录当前窗口长度 sublen := j-i+1
,与之前记录的窗口长度 result 去比较,如果当前窗口长度更短,则更新 sum -= nums[i]
和 i++
实现:
func minSubArrayLen(target int, nums []int) int {
i, sum := 0, 0
result := len(nums) + 1
for j := 0; j < len(nums) ; j++{
sum += nums[j]
for sum >= target{
sublen := j-i+1
if sublen < result{
result = sublen
}
sum -= nums[i]
i++
}
}
if result == len(nums)+1{
return 0
}else{
return result
}
}
59.螺旋矩阵II
类型: #数组
题目:给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
思路:先确定区间左闭右开,然后按题意顺时针遍历,并将值放进 matrix 就好,主要是要细心别写乱了。第一个 for 循环主要是把 matrix 变成 n×n 的 slice,因为初始化只是切片长度为 n
实现:
func generateMatrix(n int) [][]int {
left, right := 0, n-1
top, bottom := 0, n-1
num := 1
tar := n*n
matrix := make([][]int, n)
for i := 0; i < n; i++{
matrix[i] = make([]int, n)
}
for num <= tar{
//left -> right
for i := left; i <= right; i++{
matrix[top][i] = num
num++
}
top++
//top -> bottom
for i := top; i <= bottom; i++{
matrix[i][right] = num
num++
}
right--
//right -> left
for i := right; i >= left; i--{
matrix[bottom][i] = num
num++
}
bottom--
//bottom -> top
for i := bottom; i >= top; i--{
matrix[i][left] = num
num++
}
left++
}
return matrix
}