Java實(shí)現(xiàn)LeetCode(54.螺旋矩陣)
LeetCode54. 螺旋矩陣 java實(shí)現(xiàn)
題目
- 難度 中
- 給定一個(gè)包含 m x n 個(gè)元素的矩陣(m 行, n 列),請(qǐng)按照順時(shí)針螺旋順序,返回矩陣中的所有元素。
示例 1:
輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,3,6,9,8,7,4,5]
示例 2:
輸入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路
找出每個(gè)點(diǎn)的坐標(biāo),每個(gè)點(diǎn)每次延順時(shí)針分別為右、下、左、上四個(gè)方向走一個(gè)位置,維護(hù)一個(gè)方向變量,不同方向時(shí)做相應(yīng)的邊界判斷。每次遇到邊界,必定改變方向,縮短原邊界大小。
解法
public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> order = new ArrayList<>();
if (matrix.length == 0 || matrix[0].length == 0) {
return order;
}
int m = matrix.length;
int n = matrix[0].length;
int len = m * n;
int row = 0;
int col = 0;
int leftMin = 0;
//每次走上下左右四個(gè)方向,一次只走一格
//注意點(diǎn),因?yàn)槭菑模?,1)開始走的,所以上界最小row是第二行1
int topMin = 1;
//初始方向值
int k = 0;
int[][] dir = {
{1, 0, -1, 0},
{0, 1, 0, -1}
};
for (int i = 0; i < len; i++) {
order.add(matrix[row][col]);
col += dir[0][k % 4];
row += dir[1][k % 4];
switch (k % 4) {
case 0:
//右
if (col > n - 1) {
col = n - 1;
row++;
k++;
n--;
}
break;
case 1:
//下
if (row > m - 1) {
row = m - 1;
col--;
k++;
m--;
}
break;
case 2:
//左
if (col < leftMin) {
col = leftMin;
leftMin++;
row--;
k++;
}
break;
case 3:
//上
if (row < topMin) {
row = topMin;
topMin++;
col++;
k++;
}
break;
}
}
return order;
}
結(jié)果
2ms 戰(zhàn)勝99.74%
到此這篇關(guān)于Java實(shí)現(xiàn)LeetCode(螺旋矩陣)的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)螺旋矩陣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(131.拆分回文串)
- C++實(shí)現(xiàn)LeetCode(9.驗(yàn)證回文數(shù)字)
- C++實(shí)現(xiàn)LeetCode(5.最長(zhǎng)回文子串)
- C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù))
- C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)
- C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無重復(fù)字符的子串)
- C++實(shí)現(xiàn)LeetCode(2.兩個(gè)數(shù)字相加)
- C++實(shí)現(xiàn)LeetCode(132.拆分回文串之二)
相關(guān)文章
Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java實(shí)現(xiàn)讀取和寫入properties文件
這篇文章主要介紹了Java實(shí)現(xiàn)讀取和寫入properties文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析
這篇文章主要介紹了ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Springboot框架實(shí)現(xiàn)自動(dòng)裝配詳解
在使用springboot時(shí),很多配置我們都沒有做,都是springboot在幫我們完成,這很大一部分歸功于springboot自動(dòng)裝配。本文將詳細(xì)為大家講解SpringBoot的自動(dòng)裝配原理,需要的可以參考一下2022-08-08
Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Mybatis下動(dòng)態(tài)sql中##和$$的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法匯總
這篇文章主要介紹了java計(jì)算兩個(gè)時(shí)間相差天數(shù)的方法,感興趣的小伙伴們可以參考一下2015-11-11
mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說明
這篇文章主要介紹了mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

