leetcode(414)--Third Maximum Number
阿新 • • 發佈:2018-12-21
static const int _xxx = [](){ ios::sync_with_stdio(0); cin.tie(0); return 0; }(); class Solution { public: int thirdMax(vector<int>& nums) { /* //錯誤解,只與最大值比較了,沒有次大值比較,邏輯錯誤 int first=nums[0],second=nums[0],third=nums[0]; int num=1; for(int i=1;i<nums.size();i++) { if(nums[i]>=first) { num++; third=second; second=first; first=nums[i]; } else } if(num>=3) return third; else return first;*/ /* //正確解1 int first=0,second=-1,third=-1; int f=nums[0],s,t; for(int i=1;i<nums.size();i++) { if(nums[i]>f) { f=nums[i]; first=i; } } for(int i=0;i<nums.size();i++) { if(nums[i]<f) { if(second==-1) { s=nums[i]; second=i; } else if(s<nums[i]) { s=nums[i]; second=i; } } } for(int i=0;i<nums.size();i++) { if(nums[i]<f&&nums[i]<s) { if(third==-1) { t=nums[i]; third=i; } else if(t<nums[i]) { t=nums[i]; third=i; } } } if(third==-1) return f; else return t; */ //正確解2 int size=nums.size(); int min=nums[0]; //從最小值出發,從最大值出發是比較麻煩的,因為前三個最大值都要遍歷 for(auto i:nums) if(i<min)min=i; int max[]={min,min,min}; for(int i=0;i<size;i++) { if(nums[i]!=max[1]&&nums[i]!=max[2]&&nums[i]>max[0]) //前三個最大值不能包含重複值 { max[0]=nums[i]; if(max[0]>max[1])swap(max[0],max[1]); //在當前最大三個值中排序,下標0對應元素最小 if(max[1]>max[2])swap(max[1],max[2]); } } if(max[0]==max[1]) return max[2]; else return max[0]; } };
個人覺得的易錯點:
1.最大的三個值不能相同;
2.使用當前最大三個值中最大值去比較當前元素,會漏掉比當前第二大和第三大還大的數,所以使用最小值是安全的,考慮的東西也很少。