1. 442. 数组中重复的数据 - 力扣(LeetCode)
哎哟,可能是我太蠢了,我是真的觉得这些题目好神奇的,就这样做到了。感觉这道题跟昨天那道消失的它很类似,但是简单一点。
按照题目的要求数组如果排好序的话应该要是这样子的:数组下标加1等于元素值
nums[i] 等于 nums[i] - 1所指向的值;即:nums[i] = nums[nums[i] - 1]
排序前:
排序后:每个位置的元素等于其下标加1,如果不是的说明是重复的元素
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n; i++){
while(nums[i] != nums[nums[i] - 1]){
swap(nums[i], nums[nums[i] - 1]);
}
}
vector<int> res;
for(int i = 0; i < n; i++){
if(nums[i] != i + 1){
res.push_back(nums[i]);
}
}
return res;
}
};
2. 41. 缺失的第一个正数 - 力扣(LeetCode)
这个如果没有时空复杂度的要求的话,就很简单
首先遍历整个数组,将非正数都变为数组长度加一
第二个for循环 是通过对数组元素值打标记(添加负号),待会来判断数组下标是否出现过,如果num在有效范围内,则尝试访问num代表的那个正整数在理想状态下应该所在的数组位置。例如,如果nums[i] 是5,则num-1 是4,意味着要去访问nums[4],看它是否已经被标记过。修改方式是将nums[num -1]的值变为负数。所以一个位置的值是负数,表示原本那个位置对应的正整数已经在数组中出现过。
其实我不明白为什么要用abs函数来确保操作的一定是正数,通过第一个for循环,数组内的元素不都是非负数了吗
然后第三个for循环第一个大于0的数字下标加一就是缺失的数字,否则遍历完的话,就是数组长度加一
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n; i++){
if(nums[i] <= 0){
nums[i] = n + 1;
}
}
for(int i = 0; i < n; i++){
int num = abs(nums[i]);
if(num <= n){ // 存在的数只考虑 [1,n] 内的
nums[num - 1] = -abs(nums[num - 1]);
}
}
for(int i = 0; i < n; i++){
if(nums[i] > 0){
return i + 1;
}
}
return n + 1;
}
};
3. 485. 最大连续 1 的个数 - 力扣(LeetCode)
这个简单啊这个简单
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int res = -999, flag = 0;
for(int i = 0; i < nums.size(); i++){
if(nums[i] == 1){
flag++;
}
else{
res = max(flag, res);
// res.push_back(flag);
flag = 0;
}
}
return res = max(flag, res);
}
};
最后返回别忘了也要麦克西
4.
495. 提莫攻击 - 力扣(LeetCode)
当第一 次中毒还没结束第二次中毒就开始,此时的中毒时间计算如下:
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int end = 0, res = 0;
for(int i = 0; i < timeSeries.size(); i++){
if(timeSeries[i] >= end){
res += duration;
}
else{
res += timeSeries[i] + duration - end;
}
end = timeSeries[i] + duration;
}
return res;
}
};
5. 414. 第三大的数 - 力扣(LeetCode)
想到用set但是输出倒数第三个我只能用这种蠢办法。。。
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int> s(nums.begin(), nums.end());
int n = s.size();
if(s.size() < 3){
return *max_element(s.begin(), s.end());
}
else{
auto it = s.end();
// 因为end()指向最后一个元素的下一个位置,所以我们需要向前移动两次
it--;
it--;
it--;
return *it;
}
}
};
官方题解是把数组元素插入到set集合时,只要大于3就把前面的元素移除出集合,最后留在set集合里面的就是剩下最大的三个元素了咯 最后返回的时候,如果set集合长度大于3就输出第一个元素(三个里面最小的,第三大),小于三就输出最大的元素即最后一个。