持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
查找遍历
169. 多数元素
题目
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ma…
分析
如果只是暴力搜索的话无法满足进阶要求,采用“消去”的思路,这里我们用nub表示暂时的众数,cnt来作为统计。如果遍历到的数是当前的众数cnt+1,如果不是cnt-1,如果cnt为0说明之前的所有的数都被抵消过了,应该将当前的数设置为众数
代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int nub;
int cnt=0;
for(int i=0; i < nums.size(); i++){
if(cnt==0){
nub = nums[i];
}
if(nub==nums[i]){
cnt++;
}else{
cnt--;
}
}
return nub;
}
};
219. 存在重复元素 II
题目
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
提示:
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…
分析
如果用暴力的方式解题就直接运用循环进行查询即可,但是我们可以用滑动窗口的方式将时间复杂度降为O(n)。
用map记录数组中的数字出现的位置,当这个数字再次出现时求一下他们位置的差值,并且更新map的值。
代码
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
set<int> s;
map<int, int> m;
for(int i=0; i < nums.size(); i++){
if(s.count(nums[i])==0){
s.insert(nums[i]);
m[nums[i]] = i;
}else{
if(i - m[nums[i]] <= k){
return true;
}else{
m[nums[i]] = i;
}
}
}
return false;
}
};
717. 1比特与2比特字符
有两种特殊字符:
第一种字符可以用一个比特 0 来表示 第二种字符可以用两个比特(10 或 11)来表示、 给定一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一位字符,则返回 true 。
示例 1:
输入: bits = [1, 0, 0] 输出: true 解释: 唯一的编码方式是一个两比特字符和一个一比特字符。 所以最后一个字符是一比特字符。
示例 2:
输入: bits = [1, 1, 1, 0] 输出: false 解释: 唯一的编码方式是两比特字符和两比特字符。 所以最后一个字符不是一比特字符。
提示:
1 <= bits.length <= 1000 bits[i] == 0 or 1
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/1-…
分析
由于题目要求最后一位为0,所以我们遍历时应该从0位到n-2位,并且如果bits[i]==1说明它是一个2位数,i应该增加2,如果bits[i]==0说明它是一个1位数,i应该增加1
代码
class Solution {
public:
bool isOneBitCharacter(vector<int> &bits) {
int n = bits.size(), i = 0;
while (i < n - 1) {
i += bits[i] + 1;
}
return i == n - 1;
}
};