Leetcode945.使数组唯一的最小增量

最先想到Arrays.sort()用法,可以对数组进行排序,这样做测试是正确的,但是超过时间限制

class Solution {
    public int minIncrementForUnique(int[] A) {
       Arrays.sort(A);
        int count = 0;
        for(int i = 1; i < A.length; i++){
            if(A[i] == A[i - 1]){
                A[i--]++;
                Arrays.sort(A);
                count++;
            }
        }
        return count;


    }
}

因此我们不能总是使用Arrays.sort()函数,想到在初始的时候进行排序。然后在循环中,首先判断是否和前一个值是否相等,因为数组是有序数组,所以当自增后出现的情况会有和前一个数相等,小于前一个数和大于后一个数三种情况。如果是相等,则前面是有序的,该数本身需要自++,该该数自加加后,会出现比后一个数大的情况,此时数组不是有序的了,需要进行调整,和后一个换顺序,并且i--(因为两个数发生变化了,较小的数到了前面)。此时这个较小的数会存在两个情况,较小的数小于或等于前面的数,如果小于则自++,同时i--,因为不知道自++后该数的情况,如果是等于前面的数,则自++,在这种情况下,使用的内存是比较少的。需要注意的是在判断和后面数的大小时,先要判断i+1 < length,在判断大小,否则报错,在这个问题上栽了好几次了

class Solution {
    public int minIncrementForUnique(int[] A) {
        Arrays.sort(A);
	        int count = 0;
	        for(int i = 1; i < A.length; i++){
	            if(A[i] == A[i - 1]){
	                
	                A[i]++;
	                count++;
	              
	            }
	            if(A[i] < A[i-1]) {
                	A[i--]++;
	                count++;
	               // continue;
                }
	            if( (i +1) < A.length && (A[i] > A[i + 1] )){
                    int temp  = A[i];
                    A[i] = A[i + 1];
                    A[i + 1] = temp;
                    i--;
                }
	        }
	        return count;


    }
}

用数组【3,2,1,2,1,7,1】进行说明

首先sort后变成了【1,1,1,2,2,3,7】

循环从i = 1 开始,发现 1 =1 ,需要将i =1的数自增,【1,2,1,2,2,3,7】 count =1

此时发现2大于后面的数,交换顺序【1,1,2,2,2,3,7】同时i--

i又从1开始了 发现 1= 1 自增 【1,2,2,2,2,3,7】count = 2

i = 2 发现 i = 2的数和 i= 1的数相等,【1,2,3,2,2,3,7】count = 3

3大于后面的数 交换顺序并i-- 【1,2,2,3,2,3,7】 

i = 2, 和前面的数相等 自增 【1,2,3,3,2,3,7】 count =4

i= 3 发现和i =2 是数相等 自增 【1,2,3,4,2,3,7】coount = 5

发现i = 3的数此时比后面的数大 交换位置并i-- 【1,2,3,2,4,3,7】

i =3 发现比前面的数小 自增并i-- 【1,2,3,3,4,3,7】count  =6

i = 3发现和前面的数相等 自增 【1,2,3,4,4,3,7】count = 7

i = 4发现和前面的数相等 自增【1,2,3,4,5,3,7】count = 8

发现比后面的数大 交换顺序并i--【1,2,3,4,3,5,7】

i= 4 发现比前面的数小 自增并i--【1,2,3,4,4,5,7】count =9

i= 4发现和前面的数相等 自增【1,2,3,4,5,5,7】count =10

i =5 发现和前面的数相等 自增【1,2,3,4,5,6,7】count = 11

i = 6 无操作  共11次

优化 其实sort后A[i] 只可能大于等于A[i -1],但是自增后会出现A[i] <= A[i-1]的情况,此时A[i-1]之前的是有序数组,将A[i] 变成A[i -1]+1 即可,对每个数这样操作即可,但是我们需要返回自增的次数,因此先保存A[i]的值,和后来A[i]的值进行比较就是move的次数。(即count)。此时不会再有i--的情况发生

class Solution {
    public int minIncrementForUnique(int[] A) {
        Arrays.sort(A);
        int count = 0;
        // 遍历数组,若当前元素小于等于它的前一个元素,则将其变为前一个数+1
        for (int i = 1; i < A.length; i++) {
            if (A[i] <= A[i - 1]) {
                int pre = A[i];
                A[i] = A[i - 1] + 1;
                count = A[i] - pre;
            }
        }
        return count;



    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值