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 };
复制代码

 

posted @   balabalahhh  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示