陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
定義乙個關聯容器map,將元素依次塞入map中,對每個元素w依次檢驗出現的個數,w.first為元素值,w.second為對應元素個數,如果個數大於長度的一半,就返回
class solution
return
0; }
};
對所有的元素進行排序,將所有元素遍歷一遍,計算每種元素的個數,若當前元素的個數大於前面的統計結果,將結果重新整理
class solution
num = 0; //重置計數器}}
if (resultnum + 1 > len / 2) //resultnum計算結果為對應元素個數減1
return result;
return
0; }
};
當然也可以用for迴圈代替while迴圈
class solution
num = 0;}}
if (resultnum + 1 > len / 2) //resultnum計算結果為對應元素個數減1
return result;
return
0; }
};
對於vector的操作,不僅可以解引用迭代器來獲取元素,也可以通過下表來獲取元素,如vector型別的變數numbers,numbers[0]表示第乙個元素,下標從0開始;
對所有元素進行排序,則相等的元素將會在相鄰的位置。設定乙個臨時量等於每一種元素的第乙個元素,迴圈統計這種元素的個數;若後面有數量更大的元素,重新整理這個記錄,統計出最大個數的元素,如果數量大於總長度的一般,返回這個元素
class solution
num=1;
tmp=numbers[i];}}
if(resultnum>len/2)
return result;
return
0; }
};
陣列排序後,如果符合條件的數存在,則一定是陣列中間那個數。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)
class solution
if(count>len/2)
return middle;
return
0; }
};
時間複雜度分析:涉及到快排sort,時間複雜度為o(nlogn);
採用使用者「分形葉」思路(注意到目標數超過陣列長度的一半,陣列同時去掉兩個不同的數字,到最後剩下的就是目標數),如果沒有超過陣列長度的一半的目標數,則剩下某乙個,所以最後要統計剩下的這個數的個數,大於陣列長度一半,則返回該數,不大於,返回0。
class solution
else
if (tmp==numbers[i])
count++;
else
count--;
}int result=tmp;
int num=0;
for (int i = 0; i < len; i++)
if(result==numbers[i])
num++;
if(num>len/2)
return result;
return
0; }
};
時間複雜度分析:o(n) 陣列中出現次數超過一半的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。輸入 每個測試案例包括2行 第一行輸入乙個整數n 1 n 100000 表...
陣列中出現次數超過一半的數字
陣列中出現次數超過一半的數字 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。class solution count 0 for auto i numbers if i k ...
陣列中出現次數超過一半的數字
題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路 將陣列按大小排序,若存在數字出現次數超過陣列長度的一般,則陣列中位數必定為該數字 1 將陣列排序完成後,取a...