找出數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字(劍指offer29 leetcode169 )
思路:1)partition横殴,快排的部分功能袜炕,O(n)。出現(xiàn)次數(shù)超過(guò)一半即可用快排的思想求中位數(shù)即可。
2)根據(jù)數(shù)組的特點(diǎn)出發(fā),保存一個(gè)數(shù)和一個(gè)次數(shù)雳锋,如果下次遇到的數(shù)與保存的數(shù)相同,次數(shù)加一羡洁,不同減一玷过,次數(shù)為0 則保存下一個(gè)數(shù),并把次數(shù)設(shè)為1.
class Solution {
public:
int majorityElement(vector<int>& nums) {
int num,count=0;
for(int i=0;i<nums.size();i++){
if(count==0)
num=nums[i];
if(nums[i]==num)
count++;
else
count--;
}
return num;
}
};
找出最小的k個(gè)數(shù)(topK)
1.將輸入內(nèi)容進(jìn)行完全排序,選出排在前k的元素冶匹,可選擇快速排序习劫,堆排序和歸并排序咆瘟,時(shí)間復(fù)雜度O(nlogn)嚼隘。
2.只對(duì)前K大的元素進(jìn)行排序,可選擇冒泡排序或選擇排序進(jìn)行處理袒餐,即每次冒泡都能找到所求的一個(gè)元素飞蛹,時(shí)間復(fù)雜度O(Kn)。
3.對(duì)輸入內(nèi)容不進(jìn)行排序:1)利用最小堆維護(hù)大小為K的數(shù)組灸眼,該小根堆中的元素是排名前K的數(shù)卧檐,其中根是最小的數(shù)。此后焰宣,每次從原數(shù)組中取一個(gè)元素與根進(jìn)行比較霉囚,如大于根的元素,則將根元素替換并進(jìn)行堆調(diào)整(下沉)匕积,即保證小根堆中的元素仍然是排名前K的數(shù)盈罐,且根元素仍然最小闪唆;否則不予處理盅粪,取下一個(gè)數(shù)組元素繼續(xù)該過(guò)程。該算法的時(shí)間復(fù)雜度是O(nlogK)悄蕾。特點(diǎn):不需要一次將原數(shù)組中的內(nèi)容全部加載到內(nèi)存中票顾。2)利用快排的分劃函數(shù)找到劃分位置k,時(shí)間復(fù)雜度O(n)帆调。(只有當(dāng)我們可以修改輸入的數(shù)組時(shí)可用)
第一個(gè)只出現(xiàn)一次的字符(劍指offer35奠骄,leetcode387 )
思路:1)排序,O(nlogn)
2)哈希表番刊,第一遍掃描戚揭,用哈希表存儲(chǔ)字符出現(xiàn)的個(gè)數(shù);第二遍掃描撵枢,找出第一個(gè)個(gè)數(shù)為1的字符民晒,O(n)
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<char,int> map;
for(int i=0;i<s.size();i++){
map[s[i]]+=1;
}
for(int i=0;i<s.size();i++){
if(map[s[i]]==1)
return i;
}
return -1;
}
};
字符流中第一個(gè)不重復(fù)的字符(劍指offer269,[nowcoder]
思路同上锄禽,如需存儲(chǔ)位置潜必,則將map中的value替換為位置,出現(xiàn)兩次及以上賦值為-2沃但,初始化為-1.
(https://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720 ))
class Solution
{
public:
//Insert one char from stringstream
void Insert(char ch)
{
s+=ch;
map[ch]+=1;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
for(int i=0;i<s.size();i++){
if(map[s[i]]==1)
return s[i];
}
return '#';
}
unordered_map<char,int> map;
string s="";
};
整數(shù)數(shù)組中磁滚,第一個(gè)沒(méi)有出現(xiàn)的正整數(shù)leetcode41
思路:考慮整數(shù)的范圍和數(shù)組的長(zhǎng)度n的關(guān)系,第一個(gè)沒(méi)有出現(xiàn)的正整數(shù)肯定小于等于長(zhǎng)度。
(交換可用algorithm.h里的swap)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n=nums.size();
if(n==0) return 1;
for(int i=0;i<n;){
if(nums[i]<n+1&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){
int tmp=nums[i];
nums[i]=nums[tmp-1];
nums[tmp-1]=tmp;
}
else
i++;
}
for(int i=0;i<n;i++){
if(nums[i]!=i+1)
return i+1;
}
return n+1;
}
};
找出數(shù)組中只出現(xiàn)一次的數(shù)字垂攘,其它數(shù)字都出現(xiàn)了兩次
異或
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result=0;
for(int i=0;i<nums.size();i++){
result=result^nums[i];
}
return result;
}
};
找出數(shù)組中只出現(xiàn)一次的數(shù)字维雇,其它數(shù)字都出現(xiàn)了三次。
思路:1)使用map晒他,增加了空間復(fù)雜度O(n)吱型。2)排序,時(shí)間復(fù)雜度O(nlogn)
3)位操作思想陨仅,不管非孤異元素重復(fù)多少次津滞,這是通用做法。
對(duì)于右數(shù)第i位灼伤,如果孤異元素該位為0触徐,則該位為1的元素總數(shù)為3的整數(shù)倍。
如果孤異元素該位為1狐赡,則該位為1的元素總數(shù)不為3的整數(shù)倍(也就是余1)撞鹉。
換句話說(shuō),如果第i位為1的元素總數(shù)不為3的整數(shù)倍颖侄,則孤異數(shù)的第i位為1鸟雏,否則為0.
(如果非孤異元素重復(fù)n次,則判斷是否為n的整數(shù)倍)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int n=nums.size();
int result=0;
for(int i=0;i<32;i++){
int count=0;
int mask=1<<i;
for(int j=0;j<n;j++){
if(nums[j]&mask)
count++;
}
if(count%3)
result|=mask;
}
return result;
}
};
http://blog.csdn.net/jeanphorn/article/details/46501331
最后編輯于 :2017.12.10 00:21:50
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者