1. 程式人生 > >劍指offer第二版-3.數組中重復的數

劍指offer第二版-3.數組中重復的數

[] 面試 uic amp diff -- ati ray hang

面試題3:數組中重復的數

題目要求:
在一個長度為n的數組中,所有數字的取值範圍都在[0,n-1],但不知道有幾個數字重復或重復幾次,找出其中任意一個重復的數字。

解法比較:

技術分享圖片

/**
 * Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved.
 *
 */
package com.java.offer;

/**
 * 一個長度為n的數組,值的範圍在0~n-1內,有一個或多個數字重復,求其中任意一個
 * 
 * @since 2019年1月29日 下午3:46:06
 * @author xuchao
 *
 */
public
class P3_DuplicationInArray { // 方法一:暴力求解,不會修改原始數據,時間復雜度o(n^2),空間復雜度o(1) public static int getDuplication1(int[] data) { if (data == null || data.length < 2) { return -1; } for (int i = 0; i < data.length - 1; i++) { for (int j = i + 1; j < data.length; j++) {
if (data[j] == data[i]) { return data[j]; } } } return -1; } /** * 方法二:排序(使用快排),會修改原始數據,時間復雜度o(nlogn),空間復雜度o(1) * 1.使用內置排序(雙軸快排),Arrays.sort(data) * 2.自己手寫快排 */ public static int getDuplication2(int[] data) {
if (data == null || data.length < 2) { return -1; } // 可以使用內置排序(雙軸快排) // Arrays.sort(data); quickSort(data, 0, data.length - 1); for (int i = 0; i < data.length - 1; i++) { if (data[i + 1] == data[i]) { return data[i + 1]; } } return -1; } public static void quickSort(int[] data, int start, int end) { if (start >= end) { return; } int mid = partition(data, start, end); quickSort(data, start, mid - 1); quickSort(data, mid + 1, end); } public static int partition(int[] data, int start, int end) { int base = data[start]; int i=start,j=end; while (i < j) { while (i < j && data[j] >= base) { j--; } while (i < j && data[i] <= base) { i++; } if (i < j) { int t = data[i]; data[i] = data[j]; data[j] = t; } } data[start] = data[j]; data[j] = base; return j; } // 方法三:借助哈希表,不會修改原始數據,時間復雜度o(n),空間復雜度o(n) public static int getDuplication3(int[] data) { if (data == null || data.length < 2) { return -1; } int[] a = new int[data.length]; for (int t : data) { if (a[t] == 1) { return t; } else { a[t] = 1; } } return -1; } // 方法四:根據數字特點排序,會修改原始數據,時間復雜度o(n),空間復雜度o(1) public static int getDuplication4(int[] data) { if (data == null || data.length < 2) { return -1; } for (int i = 0; i < data.length; i++) { while (data[i] != i) { if (data[i] == data[data[i]]) { return data[i]; } else { int temp = data[i]; data[i] = data[temp]; data[temp] = temp; } } } return -1; } public static void main(String[] args) { int[] data1 = { 2, 5, 6, 4, 6, 3, 1 }; // 不修改原始數據 System.out.println(getDuplication1(data1)); System.out.println(getDuplication3(data1)); int[] data2 = { 2, 5, 6, 4, 6, 3, 1 }; System.out.println(getDuplication2(data2)); int[] data3 = { 4, 3, 5, 1, 5, 0 }; System.out.println(getDuplication4(data3)); } }

劍指offer第二版-3.數組中重復的數