算法训练营第二天数组part02

977. 有序数组的平方

// 双指针解法 因为是有序数组,负数平方有可能成为最大值,因此设置左右指针,让左右指针向中间移动,设置一个新数组,从最后记录,每次只求最大的值

func sortedSquares(nums []int) []int {

  n := len(nums)

  left := 0

  right := n - 1

  k := n - 1

  array := make([]int, n)

  for left <= right {

    lm := nums[left] * nums[left]

    rm := nums[right] * nums[right]

    if lm < rm {

      array[k] = rm

      right--

    } else {

      array[k] = lm

      left++

    }

    k--

  }

  return array

}

209. 长度最小的子数组

//解题思路,双指针解法,设置i,j,同时向右移动,j先移动找到大于等于target值,在移动i直到找到最新区间,计算子数组长度并和result比较谁小,把小值赋给result

注意事项,result初始值大于数组长度,便于判断,如果遍历一遍后result值仍然大于数组长度,说明没有符合条件的子数组,返回值0,有则返回result

func minSubArrayLen(target int, nums []int) int {

  i := 0

  sum := 0

  n := len(nums)

  result := n + 1

  for j := 0; j < len(nums); j++ {

    sum += nums[j]

    for sum >= target {

      sumLength := j - i + 1

      if result > sumLength {

        result = sumLength

      }

      sum = sum - nums[i]

      i++

    }

  }

  if result > n {

    return 0

  } else {

    return result

  }

}

59. 螺旋矩阵 II

//解题思路,顺时针左闭右开,不断旋转

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

func generateMatrix(n int) [][]int {

  startx := 0

  starty := 0

  loop := n / 2

  center := n / 2

  count := 1

  offset := 1

  res := make([][]int, n)

  for k := 0; k < n; k++ {

    res[k] = make([]int, n)

  }

  for loop > 0 {

    i := startx

    j := starty

    // 行不动,列变动j++

    for ; j < n-offset; j++ {

      res[startx][j] = count

      count++

    }

    // 行动i++,列不动j

    for i = startx; i < n-offset; i++ {

      res[i][j] = count

      count++

    }

    // 行不动i,列变动j--

    for ; j > starty; j-- {

      res[i][j] = count

      count++

    }

    // 行动i--,列不动j

    for ; i > startx; i-- {

      res[i][j] = count

      count++

    }

    startx++

    starty++

    offset++

    loop--

  }

  if n%2 == 1 {

    res[center][center] = n * n

  }

  return res

}

你可能感兴趣的:(算法,数据结构,go)