配列回転の問題、リートコード:48

配列要素は時計回りに回転します

leetcode:48。画像を回転させる

中難易度

与えられたN × N 2次元マトリクスは、画像を表します。

画像を時計回りに90度回転させます。

説明:

画像を**その場で**回転させる必要があります。つまり、入力2Dマトリックスを直接変更する必要があります。画像を回転させるために別のマトリックスを使用しないでください

例1:

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

例2:

给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

問題解決のアイデア:

問題の本質を理解する->大きな問題を抽象化し、変化の法則を要約する->実現する->操作速度を最適化する

配列は円によってユニットに分割されます
ここに画像の説明を挿入

左上隅と右下隅の座標を決定し、「円を縮小」します
ここに画像の説明を挿入

各レイヤーの要素を直角に回転させます

ここに画像の説明を挿入

内側の要素は外側の要素で操作されます。startX> endXまで

ここに画像の説明を挿入

テストコード:

package main

import "fmt"

func main() {
    
    
	print := func(nums [][]int) {
    
    
		for _, v := range nums {
    
    
			for _, n := range v {
    
    
				fmt.Print("\t", n)
			}
			fmt.Println()
		}
		fmt.Println("---------------")
	}

	nums := [][]int{
    
    {
    
    1, 2, 3, 4}, {
    
    5, 6, 7, 8}, {
    
    9, 10, 11, 12}, {
    
    13, 14, 15, 16}}

	print(nums)
	startX ,startY, endX ,endY := 0,0,len(nums[0]) - 1, len(nums[0]) - 1
	for startX < endX {
    
    
		for i := 0; i < endX-startX; i++ {
    
    
			nums[startX][startY+i], nums[endX-i][startY], nums[endX][endY-i],   nums[startX+i][endY] =
			nums[endX-i][startY],   nums[endX][endY-i],   nums[startX+i][endY], nums[startX][startY+i]
		}
		startX,startY,endX,endY = startX+1,startY+1,endX-1,endY-1
	}
	print(nums)
}


/*
   00 01 02 03
   10 11 12 13
   20 21 22 23
   30 31 32 33

      tmp=00
      00=30
      30=33
      33=03
      03=tmp
*/

leetcodeによって提供される関数エントリ、パラメータ変数を置き換えました

func rotate(nums [][]int)  {
    
    
   startX ,startY, endX ,endY := 0,0,len(nums[0]) - 1, len(nums[0]) - 1
	for startX < endX {
    
    
		for i := 0; i < endX-startX; i++ {
    
    
			nums[startX][startY+i], nums[endX-i][startY], nums[endX][endY-i],   nums[startX+i]  [endY] =
			nums[endX-i][startY],   nums[endX][endY-i],   nums[startX+i][endY], nums[startX][startY+i]
		}
		startX,startY,endX,endY = startX+1,startY+1,endX-1,endY-1
	}
}

完全な変更マップ

ここに画像の説明を挿入

秀一下

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/dawnto/article/details/113094675