剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题目分析
1.哈希表统计大法。时间和空间复杂度为O(N)。2.数组排序法,数组中点的元素一定为这个数字。3.摩尔投票法。时间复杂度为O(N),空间复杂度为O(1)。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int x = 0, votes = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
};
剑指 Offer 66. 构建乘积数组
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
题目分析
本题的难点在于 不能使用除法 ,即需要 只用乘法 生成数组 BB 。根据题目对 B[i]B[i] 的定义,可列表格,如下图所示。
根据表格的主对角线(全为 11 ),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使用除法 就获得结果。
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int len = a.size();
if(len == 0) return {};
vector<int> b(len, 1);
b[0] = 1;
int tmp = 1;
for(int i = 1; i < len; i++) {
// 每计算b[i] 都利用到了b[i-1]
b[i] = b[i - 1] * a[i - 1];
}
for(int i = len - 2; i >= 0; i--) {
// len -2是因为最后一行的上三角是1.
tmp *= a[i + 1];
b[i] *= tmp;
}
return b;
}
};