配列の繰り返し数3

図1は、デジタルの配列を見つける重複

問題

長さnの配列、0〜N-1の範囲内の全ての数。いくつかの数字を重複しますが、数字は繰り返し何かわからない、任意の繰り返しの数字を見つけるために、数回繰り返します。

{2,3,1,0,2,5,3} - - - - > 2又は3

思考

  1. まずソートし、[I] = ARR [I-1]の数をARR識別するためにトラバース。T(N)= O(nlogn)
  2. ハッシュテーブル、時間のためのスペース、キー番号、値は出現回数です。T(N)= O(N )
    コード
//哈希表
public static int solve2(int[] arr) {
	Map<Integer,Integer> map = new HashMap<>();
	for (int i : arr) {
		map.put(i,map.getOrDefault(i,0)+1);
	}
	for (Integer i : map.keySet()) {
		if (map.get(i)>1) 
			return i;
	}
	return -1;
}
// 快排
public static int solve(int[] arr) {
//		Arrays.sort(arr);//快排
	quickSort(arr,0,arr.length-1);
	for (int i=1; i<arr.length; i++) {
		if (arr[i]==arr[i-1]) 
			return arr[i];
	}
	return -1;
}
public static void quickSort(int[] arr,int low, int high) {
	if (low>=high) return;
	int pivot_index=partition(arr,low,high);
	quickSort(arr,low,pivot_index-1);
	quickSort(arr,pivot_index+1,high);
}
public static int partition(int[] arr,int low, int high) {
	int pivot_index=low;
	int pivot=arr[low];
	while(low<high) {
		while (low<high && arr[high]>=pivot) high--;
		while (low<high && arr[low]<=pivot) low++;
		//交换
		if (low<high) {
			int t = arr[low];
			arr[low] = arr[high];
			arr[high] = t;
		}
	}
	//low==high,如果不是已经排好,即high!=pivot_index
	if (arr[high]!=pivot) {
		int t = arr[high];
		arr[high] = arr[pivot_index];
		arr[pivot_index]=t;
	}
	return pivot_index;
}
#哈希表
def solve(arr:List[int])->int:
    map = {};
    for i in arr:
        map[i]=map.get(i,0)+1
    for i in map.keys():
        if map[i]>1:
            return i
    return -1
#快排
def solve2(arr:List[int])->int:
    # arr.sort(reverse=False)
    quickSort(arr,0,len(arr)-1)
    print(arr)
    for i in range(1,len(arr)):
        if arr[i]==arr[i-1]:
            return arr[i]
    return -1
def quickSort(arr:List[int],low:int,high:int)->None:
    if low>=high: return None
    pivot_index=partition(arr,low,high)
    quickSort(arr,low,pivot_index-1)
    quickSort(arr,pivot_index+1,high)
def partition(arr:List[int],low:int,high:int)->int:
    pivot_index=low
    pivot=arr[low]
    while low<high:
        while low < high and arr[high] >= pivot: high -= 1
        while low<high and arr[low]<=pivot: low+=1
        #交换
        if low<high:
            arr[low],arr[high]=arr[high],arr[low]
    #low==high
    if arr[high]!=arr[pivot_index]:
        arr[pivot_index],arr[high]=arr[high],arr[pivot_index]
    return pivot_index

図2は、重複した数字を見つけるために、配列を変更しません

1つの同様のアイデアが、唯一のハッシュ・テーブル・ソリューション

公開された78元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/puspos/article/details/103903658