(Java)のleetcode-287重複番号を探します

タイトル説明

[]の繰り返しの数を見つける
数はN(N-1とを含む)と1の間であるN + 1つのアレイ含むNUMSの整数を、与えられたが、それは少なくとも一つの繰り返し整数の存在を見ることができます。それだけの一意の整数を想定すると、繰り返しの数を見つけます。

例1:

入力:[1,3,4,2,2]
出力:2
例2:

入力:[3,1,3,4,2]
出力:3
説明:

あなたは、(配列が読み取り専用であることを仮定して)元の配列を変更することはできません。
(1)余分なスペースOのみを使用しています。
これは、O(N2)の時間計算量よりも少ないです。
数字の唯一の重複配列が、それは複数回繰り返してもよいです。

1つのアイデア:二分法

配列の長さがn提供される主題による発現、アレイ内のその後の要素∈[1、N-1]、及び唯一の繰り返し要素。直感的なアイデア、デジタルk∈の集合[1、N-1]、統計的な配列番号未満またはKカウントの数に等しいです。

カウント<= K、説明の繰り返し数は、(K、N-1の範囲であるなければならない。場合は
、カウントした場合> K、[0、k]の範囲内の数値定数を反復する。
この性質を利用し、我々は徐々にバイナリ検索を使用しますどこの数字狭い範囲を繰り返します。

左デジタル左および右の境界の最初のテスト= 1、右= N- 1
ループは、条件左<右:
ミッド=(+左から右へ)// 2
中間数の統計的配列の性質に応じて、要素の数より少ない
数<=ミッド場合、 DESCRIPTION繰り返し数は(中間、右]の範囲内になければならない。=ミッド+ 1左側なり
カウント> MIDは、[左、中間]の範囲になければならない数字を繰り返す説明は右=ミッド。行う場合
戻る左
複雑分析
時間複雑:O(nlog(n))は 、 二分法のログ(n)を行うトラバースN、複雑さはO(nlog(n))があるように。
空間複雑:O(1)

著者:zhu_shi_fu
リンクします。https://leetcode-cn.com/problems/find-the-duplicate-number/solution/er-fen-fa-kuai-man-zhi-zhen-zhu-xing-jie-shi-pytho /
ソース:滞在ボタン(LeetCode)
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

コード

// 二分法
class Solution {
    public int findDuplicate(int[] nums) {
    	int left = 1;
    	int right = nums.length-1;
    	while(left < right) {
    		int count = 0;
            int mid = (left + right) / 2;
    		for(int num : nums) {
    			if (num <= mid) {
    				count++;
    			}
    		}

    		if (count <= mid) {
    			left = mid + 1;	
    		} else {
                right = mid;
            }
    	}
    	return left;
    }
}

結果を発表

ここに画像を挿入説明

2つのアイデア:ダブルポインタ

https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode/
直接公式の答えに、同様のleetcode-141、アップグレードの難易度、リングリンクリストは、論理リングになります。

公開された143元の記事 ウォン称賛45 ビュー70000 +

おすすめ

転載: blog.csdn.net/z714405489/article/details/103204497