第二章 刑法的基本原則
阿新 • • 發佈:2022-03-21
網址:點選直達
題目描述:
方法一:利用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)。