迴旋矩陣演算法題解題思路

2021-08-24 22:27:01 字數 1720 閱讀 3441

原帖見:深圳一家公司面試問題,很囧

題目要求列印乙個迴旋數字矩陣

int i=5;

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

int i=6

1 2 3 4 5 6

20 21 22 23 24 7

19 32 33 34 25 8

18 31 36 35 26 9

17 30 29 28 27 10

16 15 14 13 12 11

我的解題思路分析:

1.將此矩陣分解為乙個乙個的圈,如下圖,1-20可以看成乙個圈,21-32是乙個圈,33-36也是乙個圈。

2.再將圈分解為四個均等的數列

3.列印的過程中用乙個二維陣列儲存矩陣,記錄圈數當前圈的數列長度圈開始計數的數字。如i=6,第1圈時數列長為5,開始計數的數字為0;第2圈數列長為3,開始計數的數字為20;從這些規律總結出,已知變長為i,假設當前圈數為count,則數列長step=i-1-count*2

程式**:

package snakematrix;

/** * @author heis

* @date dec 11, 2009

*/public class snakenum

/***

* 演算法複雜度為n

* 以下的演算法,在for迴圈內的一些計算是不必要的,可以用變數儲存,但是為了**更加直觀,就不做優化了。

* * @param i 矩陣邊長

*/public static int fill(int i)

} long timeused=system.currenttimemillis()-starttime;

system.out.println("總用時:"+timeused+"ms");

return array; }

/*** 列印陣列

* * @param array

*/public static void print(int array)

/***

* 演算法複雜度為n

* @param i 矩陣邊長

*/public static int fill(int i)

} long timeused=system.currenttimemillis()-starttime;

system.out.println("總用時:"+timeused+"ms");

return array; }

/*** 列印陣列

* * @param array

*/public static void print(int array){

if(array!=null){

int n=array.length;

int i=0,j;

int count=integer.valueof(n*n).tostring().length()+1;

for(;i回帖還有另外一種思路,也是用乙個二維陣列儲存陣列,按照數列順序輸出,在輸出過程中判斷輸出的方向,可以看這裡的**?page=1#1288013

迴旋矩陣 java演算法

最近要換份工作或者在家休息一段時間,所以練練常用的面試演算法題,說是原創也不完全是。不過確實是看了演算法後,自己重新實現了一遍。package com.liuliu.matrix public class shunxu public static void initialarray value pu...

演算法 劍指offer easy的題解題思路

1.劍指 offer 53 ii.0 n 1中缺失的數字 乙個長度為n 1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0 n 1之內。在範圍0 n 1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。有順序陣列,應該找到關係使用二分查詢 class solution else...

KMP演算法解題思路

bf暴力演算法進行模式匹配由於需要回溯,導致演算法效率低,kmp演算法對其進行改進的一點就是在某趟匹配失敗後,主串不進行回溯,而子串回溯到某乙個位置k。子串的每乙個位置都對應著乙個k,要找出這些值,首先列出子串所有的字首,分別對每個字首找出其最長公共前字尾 需注意,最長公共前字尾必須小於原字首且要相...