每日LeetCode (第二天)

189. 旋转数组

// 第一种 连续翻转三次
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = k%nums.size(); 
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+n);
        reverse(nums.begin()+n,nums.end());
    }
};
``
```cpp
// 第二种 开一个新数组赋值
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> a(n);
        for(int i = 0;i<n;i++){
            a[(i+k)%n] = nums[i];
        }
         nums.assign(a.begin(), a.end()); // assgin 函数主要是将一个容器中元素全部复制到另一个容器中
          //将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。
    }
}; 
 

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        int count = gcd(k, n);
        for (int start = 0; start < count; ++start) {
            int current = start;
            int prev = nums[start];
            do {
                int next = (current + k) % n;
                swap(nums[next], prev);
                current = next;
            } while (start != current);
        }
    }
};

41. 缺失的第一个正数

// 这个是简单的做法 但是空间复杂度是O(n) 不可以
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        unordered_set<int> hash;
        for(auto x : nums) hash.insert(x);

        int res = 1;
        while(hash.count(res)) res++;

        return res;
    }
};
// 对的 O(1)的空间
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        
        if(!n) return 1;// 特判一下,一个没有的时候输出1

        for(auto & x : nums) // 从第0个开始所以让每个都减1,但是为了防止越界要特判一下INT_MIN
            if(x != INT_MIN) x--;
        
        for(int i = 0;i<n;i++){ // 负数和大于长度的数不用看 并且这个数不在自己该在的位置,并且不是重复的时候就交换
            while(nums[i] >= 0 && nums[i] < n && nums[i] != i && nums[i] != nums[nums[i]])
            swap(nums[i],nums[nums[i]]);
        }

        for(int i = 0;i<n;i++) // 挨个判断 return i+1;
            if(nums[i] != i)
                return i+1;
        
        return n + 1; // 如果前面都对应上的话就输出n+1

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值