首页 > 其他分享 >代码随想录刷题第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

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

时间:2022-09-24 11:22:59浏览次数:48  
标签:977 return nums res sum 随想录 ret len 数组

977.有序数组的平方

  • 思路一:暴力解法-先将切片的元素全部转换成正数,再对切片进行排序,最后再遍历切片保存原切片中每个元素的平方值
  • 代码
ret := make([]int, len(nums))
for i := range nums {
    if nums[i] < 0 {
        ret[i] = -nums[i]
    } else {
        ret[i] = nums[i]
    }
}
sort.Ints(ret)
ret1 := make([]int, len(ret))
for i := range ret {
    ret1[i] = ret[i] * ret[i]
}
return ret1
  • 思路二:双向指针-比较当前左右两个指针指向元素平方指后的大小,将大指存储到结果切片中,并移动指针
  • 代码
l, r := 0, len(nums)-1
ret := make([]int, len(nums))
k := len(ret) - 1
for l <= r {
    if nums[r] * nums[r] >= nums[l] * nums[l] {
        ret[k] = nums[r] * nums[r]
        r--
        k--
    } else {
        ret[k] = nums[l] * nums[l]
        l++
        k--
    }
}
return ret

209.长度最小的子数组

  • 思路一:暴力解法(会超时)
  • 代码:
var sum int
res := math.MaxInt32
for i := 0; i < len(nums); i++ {
    sum = 0
    if sum >= target {
        return 1
    }
    for j := i; j < len(nums); j++ {
        if sum + nums[j] >= target {
            if res < j - i + 1 {
                res = res
            } else {
                res = j - i + 1
            }
            break
        }
        sum += nums[j]
    }
}
if res == math.MaxInt32 {
    return 0
} else {
    return res
}
  • 思路二:双指针-通过滑动窗口解题,从前往后遍历切片,依次累加,如果发现此时累加和大于target,就减去最左边的值,然后将指针右移一位,继续判断累加和,直至累加和不满足条件
  • 代码
res := math.MaxInt32
sum := 0
i := 0
for j := 0; j < len(nums); j++ {
    sum += nums[j]
    for sum >= target {
        sub := j - i + 1
        if res > sub {
            res = sub
        } else {
            res = res
        }
        sum -= nums[i]
        i++
    }
}
if res == math.MaxInt32 {
    return 0
}
return res

标签:977,return,nums,res,sum,随想录,ret,len,数组
From: https://www.cnblogs.com/xiaoxu365/p/16718378.html

相关文章