Leetcode刷题100天—5895. 获取单值网格的最小操作数—day62

举报
神的孩子在歌唱 发表于 2021/12/11 20:40:52 2021/12/11
【摘要】 前言:作者:神的孩子在歌唱大家好,我叫智,一个算法小菜鸡 5895. 获取单值网格的最小操作数难度中等3收藏分享切换为英文接收动态反馈给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。单值网格 是全部元素都相等的网格。返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。示例 1:输入:g...

前言:

作者:神的孩子在歌唱

大家好,我叫智,一个算法小菜鸡

5895. 获取单值网格的最小操作数

难度中等3收藏分享切换为英文接收动态反馈

给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 x x

单值网格 是全部元素都相等的网格。

返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1

示例 1:

img

输入:grid = [[2,4],[6,8]], x = 2
输出:4
解释:可以执行下述操作使所有元素都等于 4- 2 加 x 一次。
- 6 减 x 一次。
- 8 减 x 两次。
共计 4 次操作。

示例 2:

img

输入:grid = [[1,5],[2,3]], x = 1
输出:5
解释:可以使所有元素都等于 3

示例 3:

img

输入: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

具体思路写法(这个写法很垃圾,适合参考)

image-20211010134856515

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了

image-20211010135117609

image-20211010135136910

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;
    }
}

转载说明:跟我说明,务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。