13.哀家要长脑子了!

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就输出第一个元素(三个里面最小的,第三大),小于三就输出最大的元素即最后一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值