美文网首页
【中等】使数组唯一的最小增量

【中等】使数组唯一的最小增量

作者: 我知他风雨兼程途径日暮不赏 | 来源:发表于2020-03-22 10:27 被阅读0次

1.题目

给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。

  • 示例 1:
    输入:[1,2,2]
    输出:1
    解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
  • 示例 2:
    输入:[3,2,1,2,1,7]
    输出:6
    解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
    可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。

2.解答

2.1 JAVA代码一

会超时,超时原因:时间复杂度达到O(N2),空间复杂度O(N)。

 public int minIncrementForUnique(int[] A) {
        int len = A.length;
        if(len==0||len==1){
            return 0;
        }
        int res = 0;
        // [主程序-逻辑]:将遍历过的数据存入set中,每次进行对比,如果重复+1再判断
        Set<Integer> set = new HashSet<>();
        set.add(A[0]);
        for(int i=1;i<len;i++){
            int k = A[i];
            while(set.contains(k)){
                k++;
                res++;
            }
            set.add(k);
        }
        return res;
    }

2.2 JAVA代码二

先继续快排,而后贪心算法,时间复杂度O(NlogN),空间复杂度O(1);

 /***
     * 快排交换
     */
    public  int quickSwapSort(int[] array,int begin,int end){
        int i= begin;
        int j = end;
        int k = array[i];
        while(i<j){
            // 从右往左
            while(i<j && array[j]>=k){
                j--;
            }
            if(i<j){
                array[i] = array[j];
                i++;
            }

            // 从左往右
            while(i<j && array[i]<k){
                i++;
            }
            if(i<j){
                array[j] = array[i];
                j--;
            }
        }
        array[i] = k;
        return i;
    }

    /***
     * 快速排序
     */
    public  void quickSort(int[] array,int begin,int end){
        if(begin>end){
            return;
        }
        int i= quickSwapSort(array,begin,end);
        quickSort(array,begin,i-1);
        quickSort(array,i+1,end);

    }
    public int minIncrementForUnique(int[] A) {
        int len = A.length;
        if(len==0||len==1){
            return 0;
        }
        // [主程序-快排]:将数组进行快速排序
        quickSort(A,0,len-1);
        /***
         * [主程序-贪心算法]:
         *  逻辑1:A[i]需要和A[0]到A[i-1]进行对比是否重复
         *  逻辑2:如果重复需要继续A[i]++直到不重复为止
         */
        int res = 0;
        for(int i=1;i<len;i++){
            if(A[i-1]>=A[i]){
                res+=A[i-1]-A[i]+1;
                A[i]=A[i-1]+1;
            }
        }
        return res;
    }

相关文章

网友评论

      本文标题:【中等】使数组唯一的最小增量

      本文链接:https://www.haomeiwen.com/subject/flsmyhtx.html