1. 程式人生 > 其它 >劍指offer——陣列中重複的數字C++

劍指offer——陣列中重複的數字C++

技術標籤:劍指Offer陣列演算法leetcode劍指offer

在這裡插入圖片描述
法1就是用map,如果map對應的值==1了就證明找到重複了。如果不為1,就對應的值++。
法2:高階法,因為所有數字的範圍是0到n-1,如果沒有重複,那麼每一位就在每一位的位置上,0就在0號位,1就在1號位。如果有重複,那麼就會發生搶位的情況。遍歷該陣列,如果在自己的位置上,就continue。如果不在,就判斷當前的值和它本來該放的位置的值是否相等,如果相等,那麼就是找到重複的了,直接return true。如果不等,就把它放回該放的位置,用swap即可。

#include<unordered_map>
class
Solution { public: // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number // Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false bool duplicate(int numbers[], int length, int* duplication) { //找重複,1是用map,2是用位運算(但是這裡不知道有幾個重複數字,所以不能位運算) //3,是排序後依次比較 /*unordered_map<int,int> ma; //直接迴圈到length也可 for(int i = 0; i < length; ++i){ if(ma[numbers[i]] == 1){ duplication[0] = numbers[i]; return true; } ma[numbers[i]]++; }*/
for(int i = 0; i < length; ++i){ if(numbers[i] < 0 || numbers[i] > length-1) return false; } for(int i = 0; i < length; ++i){ //numbers[i] == i時證明這個數放回原來的位置了 //將它和它應該放的位置比較,如果不匹配,就讓它去該換的 //如果相同,證明找到了 if(numbers[i] == i) continue; else if(numbers[i] == numbers[numbers[i]]){ *duplication = numbers[i]; return true; } else{ swap(numbers[i],numbers[numbers[i]]); } } return false; } };