今天登陆leetcode突然发现531被锁了,有种占了便宜的感觉哈哈哈!
================================================
leetcode229 Majority Element II
leetcode238 Product of Array Except Self
leetcode268 Missing Number
================================================
229讲的是
给你n个数字,找出所有出现次数超过n/3的数字,要求O(n)time O(1)space
这道题简化版是 leetcode169 解法见2017-3-6
我的思路
类似169,只不过这次因为总数大于[n/3],要维护两个候选数字(最多有两个元素符合要求),每次有新的数字出现的时候,两个计数器都要减。扫一遍得到两个候选数字后,再扫一遍确认数目是否符合要求。
1 class Solution { 2 public: 3 vector<int> majorityElement(vector<int>& nums) { 4 int n=nums.size(); 5 int num1=-1,num2=-1,cnt1=0,cnt2=0; 6 for(int i=0;i<n;i++){ 7 if(num1==nums[i]){ 8 cnt1++; 9 }else if(num2==nums[i]){ 10 cnt2++; 11 }else if(!cnt1){ 12 cnt1++;num1=nums[i]; 13 }else if(!cnt2){ 14 cnt2++;num2=nums[i]; 15 }else{ 16 cnt1--;cnt2--; 17 } 18 } 19 cnt1=cnt2=0; 20 for(int i=0;i<n;i++){ 21 if(nums[i]==num1)cnt1++; 22 if(nums[i]==num2)cnt2++; 23 } 24 vector<int> aim; 25 if(cnt1>n/3)aim.push_back(num1); 26 if(cnt2>n/3)aim.push_back(num2); 27 return aim; 28 } 29 };
=================================================
238讲的是
给你一个n个数的数组nums[i],输出一个n个数的数组output[i]=nums的累乘/nums[i]。要求不能使用除法,O(n)time
我的思路
求个前缀乘,求个后缀乘,然后乘在一起?????
1 class Solution { 2 public: 3 vector<int> productExceptSelf(vector<int>& nums) { 4 int n=nums.size(); 5 vector<int> pre_pro(n,1),suf_pro(n,1),output(n); 6 for(int i=n-2;i>-1;i--){ 7 suf_pro[i]=suf_pro[i+1]*nums[i+1]; 8 } 9 output[0]=suf_pro[0]; 10 for(int i=1;i<n;i++){ 11 pre_pro[i]=pre_pro[i-1]*nums[i-1]; 12 output[i]=suf_pro[i]*pre_pro[i]; 13 } 14 return output; 15 } 16 };
击败了7%的用户,恩,意料之中
看一下别人写的
思维被局限了,如果只要求前缀和,我们可以O(1)space来解决,现在多了后缀,也可以,只需要顺序扫的同时把逆序的也处理一下。
1 class Solution { 2 public: 3 vector<int> productExceptSelf(vector<int>& nums) { 4 int n=nums.size(); 5 int pre_pro=1,suf_pro=1; 6 vector<int> output(n,1); 7 for(int i=0;i<n;i++){ 8 output[i]*=pre_pro; 9 pre_pro*=nums[i]; 10 output[n-1-i]*=suf_pro; 11 suf_pro*=nums[n-1-i]; 12 } 13 return output; 14 } 15 };
击败了26%。。。哪里有问题呢。。。。我看了其他的代码,貌似思路都一样,可能是评测机抽风吧
=================================================
268讲的是
给你n个不同的数字,a[i]属于[0,n],问你缺少了哪个数字
思路
水题。。。n*(n+1)/2减去累加和
1 class Solution { 2 public: 3 int missingNumber(vector<int>& nums) { 4 int n=nums.size(),tot=0; 5 for(int i=0;i<n;i++){ 6 tot+=nums[i]; 7 } 8 return n*(n+1)/2-tot; 9 } 10 };