「剣指offer+LeetCode」アルゴリズムの考え方を整理して配列の中で重複する数字を探し出す


剣はofferの配列の中で繰り返す数字を探し出すことを指します
タイトルは1つの長さnの配列の中のすべての数字が0からn-1の範囲内にあることを説明します.配列のいくつかの数字は重複していますが、いくつかの数字が重複していることは分かりません.数字ごとに何回繰り返されるか分からない.配列のいずれかの重複する数字を見つけてください.例えば、長さ7の配列{2,3,1,0,2,5,3}が入力されると、対応する出力は、最初に繰り返される数字2である.
これは、乱れて座っている学生が座席番号に基づいて自分の席を探しているようなものだ.学生がその位置でない限り、学生を変え続け、その位置が正しい人が座るまで次の席の同級生を検査し続けた.学生交代の過程で、交代される学生席に人がいたら、重複する座席番号を見つけた.
テーマをはっきりさせる
まずはテーマの意味をはっきりさせよう!!!(黒板を叩く)
次の3つの点があります.
1人からもらった配列の数値は範囲があります(0からn-1).2配列長はnである.3重複する数字が見つかれば、戻ることができます.
だから考えが来ました
i位置にないmをその位置に送る過程で、m位置にmがあることを発見すれば重複数mが見つかる.
使用するツール:(forループ+whileループ+if文)
forループ満足:iはi位置でループに入る.
whileサイクル満足:i位置ではiではなくmである.
whileサイクルでやること:if判断をして、繰り返し数字を見つけます.
if条件文で行うこと:i位置の数字mがその位置にないと判断するm位置.不在でiとmを交換し、whileサイクルを継続します.重複する数字が見つかりました.
コアコードを次に示します.
//     ,      。
for( int i=0;i<length;i++{
while( nums[i] != i){
   int m=nums[i];//   i      ,  m    
   if( nums[m] == m ){
    return i;
   }
   // m   m    ,     i      ,       while  
   int n = nums[m];//   m      ,  n    
   nums[i]=n;
   nums[m]=m;
}
}


まとめ:1「学生がその位置でない限り、学生を変え続けます」対応はwhileサイクルです.2「次の生徒をチェックする」はforループです.
个人的な考え:以上は私がコードの実现をする时、私が理解しにくいところ(私が难しいと思うのはどのように循环を使うか)を考えて整理して、すべての人の考え方は异なって、だからすべての人は完全なコードを书く过程の中で异なっている难题に出会って、すべての难点を拡大して、整理して、すべての难点を解决することができます.コメントエリアでアルゴリズムの問題を書くときに自分が直面した難題を書いて、一緒に検討してください.最短の時間コストで問題を解決してほしいです.