代码随想录 | Day 2 | 2023.07.27

今日题目: 

977.有序数组的平方

209.长度最小的子数组

59.螺旋矩阵II

977.有序数组的平方

要点:

1. 理解只有负数会在平方后打乱结果数组的顺序

2. 根据1的条件可以使用双指针分别处理正数与负数

3. 采用类似归并排序的思想

代码:

func sortedSquares(nums []int) []int {
    res := make([]int,len(nums))
    i := 0 //左指针指向负数的最小值
    j := len(nums)-1 //右指针指向正数的最大值
    k :=len(nums)-1 //指向res的指针
    for i<=j {
        if sqrt(nums[i])<sqrt(nums[j]){
            res[k] = sqrt(nums[j])
            j--
            k--
        } else {
            res[k] = sqrt(nums[i])
            i++
            k--
        }
    }
    return res
}


func sqrt(a int) int {
    return a*a
}

209. 长度最小的子数组

要点:

1. 使用双指针实现滑动窗口,类似于“虫取法”, 右指针向前探索,左指针维持符合条件的窗口

2. 难点在于对左指针的处理

碰见这种求子数组的题目,首先可以考虑滑动窗口。滑动窗口的一个难点在于如何处理左右指针的相邻元素。这道题中右指针不断向右探索,使得累计和能够大于target即可。但是当sum大于target的时候,此时左指针是有可能向右移动的, 比如 1,1,1,1,100这种序列。所以此时需要固定右指针,左指针不断右移,探索最小长度的情况。

代码:

func minSubArrayLen(target int, nums []int) int {
    left := 0
    right := 0
    minLength := 2147483647
    sum := 0
    for right < len(nums) {
        sum += nums[right]
        for sum >= target {
            if minLength > right-left+1 {
                minLength = right - left +1
            }
            sum -= nums[left]
            left++
        }
        right++
    }
    if minLength == 2147483647 {
        return 0
    } else {
        return minLength
    }
}

59. 螺旋矩阵 II

要点:

1. 模拟就行,但是要想清楚边界条件,注意旋转圈数和边长的关系

2. 对每条边采用左闭右开的原则从而保证每条边的处理的是相似的

3. 分奇偶情况讨论

代码:

func generateMatrix(n int) [][]int {
    matrix := createMatrix(n)
    i := 0
    j := 0
    num := 1
    round := 0
    isOdd := 0
    if n%2 == 1{
        isOdd = 1
    }
    for num<=n*n-isOdd{
        for ; j <n-round-1;j++{
            matrix[i][j] = num
            num++
        }
        for ; i <n-round-1;i++{
            matrix[i][j] = num
            num++
        }
        for ; j >round; j--{
            matrix[i][j] = num
            num++
        }
        for ; i >round; i--{
            matrix[i][j] = num
            num++
        }
        i++
        j++
        round++
    }
    if isOdd == 1 {
        matrix[i][j] = num
    }
    return matrix
}


func createMatrix(n int) [][]int {
	matrix := make([][]int, n)
	for i := range matrix {
		matrix[i] = make([]int, n)
		for j := range matrix[i] {
			matrix[i][j] = 0 
		}
	}
	return matrix
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值