Leetcode刷题100天—5895. 获取单值网格的最小操作数—day62
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—5895. 获取单值网格的最小操作数—day62相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
大家好,我叫智,一个算法小菜鸡
5895. 获取单值网格的最小操作数
难度中等3收藏分享切换为英文接收动态反馈
给你一个大小为 m x n
的二维整数网格 grid
和一个整数 x
。每一次操作,你可以对 grid
中的任一元素 加 x
或 减 x
。
单值网格 是全部元素都相等的网格。
返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1
。
示例 1:
输入:grid = [[2,4],[6,8]], x = 2
输出:4
解释:可以执行下述操作使所有元素都等于 4 :
- 2 加 x 一次。
- 6 减 x 一次。
- 8 减 x 两次。
共计 4 次操作。
示例 2:
输入:grid = [[1,5],[2,3]], x = 1
输出:5
解释:可以使所有元素都等于 3 。
示例 3:
输入:grid = [[1,2],[3,4]], x = 2
输出:-1
解释:无法使所有元素相等。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 105
1 <= m * n <= 105
1 <= x, grid[i][j] <= 104
具体思路写法(这个写法很垃圾,适合参考)
import java.util.Arrays;
import java.util.List;
/*
* https://leetcode-cn.com/problems/minimum-operations-to-make-a-uni-value-grid/
* 具体思路:将二维数组变成一维,通过sort排序,获取中间值,然后在遍历一维获得与中间值的差值
* ,通过差值跟x作比较就可以获取他的次数了
*/
public class ddd
public int minOperations(int[][] grid, int x)
int num=0;
int m=grid.length;
int n=grid[0].length;
int[] list=new int[m*n];
int c=0;
// 遍历成一维数组
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
list[c++]=grid[i][j];
// 排序
Arrays.sort(list);
if(list.length==1||list.length==0)
return 0;
// 找到中间值
int pivot=0;
if(list.length%2==1)
pivot=list[list.length/2];
else if(list.length%2==0)
pivot=list[list.length/2-1];
// 通过for循环遍历
for(int i=0;i<list.length;i++)
int re=list[i];
// 如果等于中间值就跳过
if (re==pivot)
continue;
// 如果在中间值左边就通过加x来判断
else if (re<pivot)
while(re<pivot)
re+=x;
if (re>pivot)
return -1;
num++;
// System.out.println(num);
// 如果在中间值右边就通过加x来判断
else if (re>pivot)
while(re>pivot)
re-=x;
if (re<pivot)
return -1;
num++;
// System.out.println(re);
return num;
优化,通过abs取差值的绝对值,这样就不用我们判断ifelse了
import java.util.Arrays;
import java.util.List;
/*
* https://leetcode-cn.com/problems/minimum-operations-to-make-a-uni-value-grid/
* 具体思路:将二维数组变成一维,通过sort排序,获取中间值,然后在遍历一维获得与中间值的差值
* ,通过差值跟x作比较就可以获取他的次数了
*/
public class ddd
public int minOperations(int[][] grid, int x)
int num=0;
int m=grid.length;
int n=grid[0].length;
int[] list=new int[m*n];
int c=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
list[c++]=grid[i][j];
// 排序
Arrays.sort(list);
if(list.length==1||list.length==0)
return 0;
// 找到中间值
int pivot=0;
if(list.length%2==1)
pivot=list[list.length/2];
else if(list.length%2==0)
pivot=list[list.length/2-1];
for(int a : list)
int l = Math.abs(pivot-a);
if(l%x != 0) return -1;
num += l/x;
return num;
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
以上是关于Leetcode刷题100天—5895. 获取单值网格的最小操作数—day62的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—662. 二叉树最大宽度(二叉树)—day09
Leetcode刷题100天—121. 买卖股票的最佳时机(数组+双指针)—day24
Leetcode刷题100天—121. 买卖股票的最佳时机(数组+双指针)—day24