Go語(yǔ)言題解LeetCode1260二維網(wǎng)格遷移示例詳解
題目描述
1260. 二維網(wǎng)格遷移 - 力扣(LeetCode)
給你一個(gè) m 行 n 列的二維網(wǎng)格 grid 和一個(gè)整數(shù) k。你需要將 grid 遷移 k 次。
每次「遷移」操作將會(huì)引發(fā)下述活動(dòng):
- 位于 grid[i][j] 的元素將會(huì)移動(dòng)到 grid[i][j + 1]。
- 位于 grid[i][n - 1] 的元素將會(huì)移動(dòng)到 grid[i + 1][0]。
- 位于 grid[m - 1][n - 1] 的元素將會(huì)移動(dòng)到 grid[0][0]。
請(qǐng)你返回 k 次遷移操作后最終得到的 二維網(wǎng)格。
示例 1:

輸入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
輸出:[[9,1,2],[3,4,5],[6,7,8]]
示例 2:

輸入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
輸出:[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
示例 3:
輸入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
輸出:[[1,2,3],[4,5,6],[7,8,9]]
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m <= 50
- 1 <= n <= 50
- -1000 <= grid[i][j] <= 1000
- 0 <= k <= 100
思路分析
- 最笨的方法移動(dòng)k次
- 第一次優(yōu)化,對(duì)k取模,比如一個(gè)3*3的網(wǎng)格,移9次等于沒(méi)有移
- 第二次優(yōu)化,由k的值確定向左移簡(jiǎn)單還是向右移簡(jiǎn)單:正常情況是向右移,比如一個(gè)3*3的網(wǎng)格,要求移8次,相當(dāng)于左移一次
- 第三次優(yōu)化,空間換時(shí)間,需要多建立長(zhǎng)度為k的臨時(shí)數(shù)組,但這樣可以把k次移動(dòng)變成1次移動(dòng),除了需要移動(dòng)到臨時(shí)數(shù)組里的元素,其它元素的移動(dòng)步長(zhǎng)都是k。(這樣一來(lái),其實(shí)第二次優(yōu)化的意義不是很大,就省了一點(diǎn)內(nèi)存而已)
AC 代碼
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
int []yw=new int[grid.length*grid[0].length];
int p=0;
for(int i=0;i<grid.length;i++) {
for(int j=0;j<grid[0].length;j++) {
yw[p++]=grid[i][j];
}
}
k=k%yw.length;
if(k<yw.length/2) {//右移
int []tmp=new int[k];
int pnt=yw.length-k;
for(int i=0;i<k;i++) {
tmp[i]=yw[pnt];
pnt++;
}
for(int i=yw.length-k-1;i>=0;i--) {
yw[i+k]=yw[i];
}
for(int i=0;i<k;i++) {
yw[i]=tmp[i];
}
} else {//左移
k=yw.length-k;
int []tmp=new int[k];
for(int i=0;i<k;i++) {
tmp[i]=yw[i];
}
for(int i=k;i<yw.length;i++) {
yw[i-k]=yw[i];
}
int pnt=yw.length-k;
for(int i=0;i<k;i++) {
yw[pnt]=tmp[i];
pnt++;
}
}
List<List<Integer>> res=new ArrayList<>();
List<Integer> tp=new ArrayList<>();
p=0;
for(int i=0;i<grid.length;i++) {
for(int j=0;j<grid[0].length;j++) {
tp.add(yw[p++]);
}
res.add(tp);
tp=new ArrayList<>();
}
return res;
}
}以上就是Go語(yǔ)言題解LeetCode1260二維網(wǎng)格遷移示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言二維網(wǎng)格遷移的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別
這篇文章主要給大家介紹了關(guān)于Golang定時(shí)器的2種實(shí)現(xiàn)方法與區(qū)別的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例
這篇文章主要介紹了golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語(yǔ)言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下2016-07-07
Go?Excelize?API源碼解析GetSheetFormatPr使用示例
這篇文章主要為大家介紹了Go?Excelize?API源碼解析GetSheetFormatPr使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
詳解Go語(yǔ)言中Goroutine退出機(jī)制的原理及使用
goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò)?go?關(guān)鍵字來(lái)開啟?goroutine?即可。本文就來(lái)詳細(xì)講講Goroutine退出機(jī)制的原理及使用,感興趣的可以了解一下2022-07-07
使用Golang實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析
在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)數(shù)據(jù)包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網(wǎng)絡(luò)流量的方法,用于獲取網(wǎng)絡(luò)數(shù)據(jù)包并對(duì)其進(jìn)行分析,本文將介紹如何使用Golang實(shí)現(xiàn)抓包功能,包括網(wǎng)絡(luò)數(shù)據(jù)包捕獲和數(shù)據(jù)包分析,需要的朋友可以參考下2023-11-11
Go 語(yǔ)言入門學(xué)習(xí)之正則表達(dá)式
這篇文章主要介紹了Go 語(yǔ)言入門學(xué)習(xí)之正則表達(dá)式,文章基于GO語(yǔ)言的相關(guān)資料展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04

