1. 程式人生 > 遊戲資訊 >第七位自制英雄:星之子

第七位自制英雄:星之子

網址:點選直達

 

題目描述:

 

方法一:利用set集合

什麼是set集合呢?

set集合類似於一個罐子,程式可以依次把多個物件“丟進”set集合,而set集合通常不能記住元素的新增順序,用於儲存無序(存入和取出的順序不一定相同)元素。實際上set就是Collection,只是set注重獨一無二的性質,不會儲存重複的元素。如果試圖把兩個相同元素加入同一個set集合中,則新增失敗,add()方法返回false,且新元素不會被加入。

核心思想:

引入set集合,遍歷陣列元素,檢查元素是否在集合中,不在則將元素插入到集合裡面;否則表明當前元素在陣列中重複,返回當前元素。

int duplicate(vector<int
>& numbers) { set<int> s; for(int i=0;i<numbers.size();i++){ if(s.count(numbers[i])>0) return numbers[i]; else s.insert(numbers[i]); } return -1; }

複雜度分析:

程式碼使用了迴圈,迴圈次數為陣列大小,因此該方法的時間複雜度為O(N)。由於引入額外的集合,因此空間複雜度為O(N),最壞的情況是陣列中的元素都不重複。

方法二:資料重排

核心思想:

從頭到尾掃描陣列S中的每一個元素,當掃描到第i個元素的時候,比較第i個元素位置的值m是否等於i,如果相等,則說明該元素已經在排好序的位置,繼續掃描其他元素;如果不相等,先判斷m是否等於S[m],相等則說明不同位置上的元素值相等,即元素重複,直接返回元素;否則,交換m和S[m],將他們放置到排好序的位置。

 

核心程式碼:

int duplicate(vector<int>& numbers) {
    int i=0,n=numbers.size();
    while(i<n){
        if(numbers[i] == i){    //
第i個位置的元素就是i i++; continue; }else{ if(numbers[i] == numbers[numbers[i]]) //不同位置上出現了相同的元素,即元素重複 return numbers[i]; else swap(numbers[i],numbers[numbers[i]]); //交換元素到對應的位置 } } return -1; }

複雜度分析:

程式碼使用了迴圈,迴圈次數為陣列的大小,因此該方法的時間複雜度為O(N)。由於沒有采用額外的陣列空間,空間複雜度為O(1)。