其他分享
首页 > 其他分享> > day23

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