日月的弯刀  
Where Amazing Happens!

 


判断数组中是否有重复值

 
 

第14节 重复值判断练习题

 

请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。

给定一个int数组A及它的大小n,请返回它是否有重复值。

测试样例:
[1,2,3,4,5,5,6],7
返回:true
 
 
1
import java.util.*;
2

3
public class Checker {
4
    public boolean checkDuplicate(int[] a, int n) {
5
        int lastIndex = n - 1;
6
        builedMaxHeap(a,lastIndex);
7
        while(lastIndex > 0){
8
            swap(a,0,lastIndex);
9
            if(--lastIndex == 0){//如果只剩一个元素,就不用重新建堆了,排序结束
10
                break;
11
            }
12
            adjustHeap(a,0,lastIndex);
13
        }
14

15
        for(int i = 0; i < n-1; i++){
16
            if(a[i] == a[i+1])
17
                return true;
18
        }
19
        return false;
20
    }
21

22

23

24
    public void builedMaxHeap(int[] arr, int lastIndex) {
25
        //从最后一个元素的父元素开始构建最大堆
26
        int j = (lastIndex - 1)/2;
27
        while(j >= 0){
28
            int rootIndex = j;
29
            adjustHeap(arr,rootIndex,lastIndex);
30
            j--;
31
        }
32
    }
33

34
    public void adjustHeap(int[] arr, int rootIndex, int lastIndex) {
35
        int childNodeIndex = rootIndex * 2 + 1;
36

37
        while(childNodeIndex <= lastIndex){//至少有一个子节点的时候,继续循环
38
            //有右孩子,并且右孩子比左孩子大,那么childNodeIndex赋值给更大的孩子
39
            if((childNodeIndex+1) <= lastIndex && arr[childNodeIndex+1] > arr[childNodeIndex]){
40
                childNodeIndex++;
41
            }
42
            //子孩子比父亲小,说明堆构建完成,跳出循环
43
            if(arr[childNodeIndex] <= arr[rootIndex]){
44
                break;
45
            }
46
            else{
47
                swap(arr, rootIndex, childNodeIndex);
48
                rootIndex = childNodeIndex;
49
                childNodeIndex = childNodeIndex * 2 + 1;
50
            }
51
        }
52
    }
53

54
    public void swap(int[] arr, int m, int n) {
55
        int temp = arr[m];
56
        arr[m] = arr[n];
57
        arr[n] = temp;
58
    }
59
}
 
 
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

 
 
posted on 2017-03-11 15:06  日月的弯刀  阅读(7164)  评论(0编辑  收藏  举报