day23
作者:互联网
1.剑指 Offer 39. 数组中出现次数超过一半的数字
1)排序后位于中间的数就是我们要求的数
1 class Solution { 2 public: 3 int majorityElement(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 return nums[nums.size()/2]; //因为底数是从0开始计数的,所以nums.size()/2的位置实际上是nums.size()/2 + 1的位置 6 } 7 };
2)摩尔投票法,https://leetcode.cn/leetbook/read/illustration-of-algorithm/99ussv/
就是x记录了一个数,用votes来记录这个数的票数(也就是它出现的次数),如果接下来的数和它不同votes就减一,相同就加一,当votes等于0时就重新选一个数开始计票,因为我们所求的数字出现次数超过一半,所以它的票数比 其他与它不同的数 的票数 加起来都多,所以到最后votes大于0的留下来的x肯定就是我们所求的
1 class Solution { 2 public: 3 int majorityElement(vector<int>& nums) { 4 int x,votes = 0; 5 for(auto num : nums){ 6 if(votes == 0) x = num; 7 if(x == num) votes ++; 8 else votes --; 9 } 10 return x; 11 } 12 };
2.剑指 Offer 66. 构建乘积数组
before累乘i前面i ~1个元素,after累乘i后面i ~ n后面的元素 ,所以b[i]=before[i - 1]*after[i + 1];
1 class Solution { 2 public: 3 vector<int> constructArr(vector<int>& a) { 4 vector<int> b; 5 int n = a.size(); 6 if(n == 0) return b; 7 int before[n],after[n]; 8 before[0] = a[0],after[n - 1] = a[n - 1]; 9 for(int i = 1;i < n - 1;i ++) 10 before[i] = a[i] * before[i - 1]; 11 for(int i = n - 2;i > 0;i --) 12 after[i] = a[i] * after[i + 1]; 13 for(int i = 0;i < n;i ++){ 14 if(i == 0) b.push_back(after[1]); 15 else if(i == n - 1) b.push_back(before[n - 2]); 16 else b.push_back(before[i - 1]*after[i + 1]); 17 } 18 return b; 19 } 20 };
标签:votes,nums,int,after,day23,vector,before 来源: https://www.cnblogs.com/balabalabubalabala/p/16493670.html