Go语言题解LeetCode1260二维网格迁移示例详解

 更新时间:2023年01月05日 14:45:07   作者:刘09k11  
这篇文章主要为大家介绍了Go语言题解LeetCode1260二维网格迁移示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目描述

1260. 二维网格迁移 - 力扣(LeetCode)

给你一个 mn 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动:

  • 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
  • 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
  • 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。

请你返回 k 次迁移操作后最终得到的 二维网格

示例 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

思路分析

  • 最笨的方法移动k次
  • 第一次优化,对k取模,比如一个3*3的网格,移9次等于没有移
  • 第二次优化,由k的值确定向左移简单还是向右移简单:正常情况是向右移,比如一个3*3的网格,要求移8次,相当于左移一次
  • 第三次优化,空间换时间,需要多建立长度为k的临时数组,但这样可以把k次移动变成1次移动,除了需要移动到临时数组里的元素,其它元素的移动步长都是k。(这样一来,其实第二次优化的意义不是很大,就省了一点内存而已)

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语言题解LeetCode1260二维网格迁移示例详解的详细内容,更多关于Go语言二维网格迁移的资料请关注脚本之家其它相关文章!

相关文章

  • Golang定时器的2种实现方法与区别

    Golang定时器的2种实现方法与区别

    这篇文章主要给大家介绍了关于Golang定时器的2种实现方法与区别的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • golang实现http服务器处理静态文件示例

    golang实现http服务器处理静态文件示例

    这篇文章主要介绍了golang实现http服务器处理静态文件的方法,涉及Go语言基于http协议处理文件的相关技巧,需要的朋友可以参考下
    2016-07-07
  • Go Excelize API源码解析GetSheetFormatPr使用示例

    Go Excelize API源码解析GetSheetFormatPr使用示例

    这篇文章主要为大家介绍了Go Excelize API源码解析GetSheetFormatPr使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang使用Swagger文档教程详解

    Golang使用Swagger文档教程详解

    这篇文章主要为大家详细介绍Golang使用Swagger文档教程的相关知识,文中通过示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-12-12
  • 详解Go语言中Goroutine退出机制的原理及使用

    详解Go语言中Goroutine退出机制的原理及使用

    goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可。本文就来详细讲讲Goroutine退出机制的原理及使用,感兴趣的可以了解一下
    2022-07-07
  • 使用Golang实现对网络数据包的捕获与分析

    使用Golang实现对网络数据包的捕获与分析

    在网络通信中,网络数据包是信息传递的基本单位,抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析,本文将介绍如何使用Golang实现抓包功能,包括网络数据包捕获和数据包分析,需要的朋友可以参考下
    2023-11-11
  • Go并发编程之死锁与活锁的案例分析

    Go并发编程之死锁与活锁的案例分析

    死锁就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完成;活锁就是程序一直在运行,但是无法取得进展。本文将从一些案例出发,分析一下它们,希望对大家有所帮助
    2023-04-04
  • Go 语言入门学习之正则表达式

    Go 语言入门学习之正则表达式

    这篇文章主要介绍了Go 语言入门学习之正则表达式,文章基于GO语言的相关资料展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Go中变量命名规则与实例

    Go中变量命名规则与实例

    命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名,下面这篇文章主要给大家介绍了关于Go中变量命名的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 详解Golang中零拷贝的原理以及实践

    详解Golang中零拷贝的原理以及实践

    零拷贝技术相信大家都有所耳闻,但是本文不仅会讲述零拷贝技术的原理,并将从实际代码出发,看看零拷贝技术在golang中的应用,现在让我们开始吧
    2023-07-07

最新评论