每日一题?(或者几题)

今天带来一道找到数组中所有消失的数字,这道题直接的做法就是循环两次,一次统计所有出现的,一次把没出现的输出,很简单,但是空间复杂度有点高。

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> vec(nums.size() + 1);
        vector<int> as;
        for (int i = 0; i < nums.size(); i++) {
            vec[nums[i]]++;
        }
        for (int i = 1; i <= nums.size(); i++) {
            if (vec[i] == 0) {
                as.push_back(i);
            }
        }
        return as;
    }
};

那么有没有不使用额外空间的方法呢,那就是要对原数组做文章。我们可以对原数组进行标记,我们已知有一个含 n 个整数的数组 nums,其中 nums[i] 在区间 [1, n] 内,那么我们可以把每一位看做一个数。我们访问一个数,便把这个数对应的数值的那一位变成一个负数。那么这样以来等访问完数组的每一位,对应数值的那一位的数便全都变成负数了。我们只需要再访问一次数组,那么不是负数的那几位便是消失的数字,把他们输出就可以了。代码如下:

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            nums[abs(nums[i]) - 1] = -abs(nums[abs(nums[i]) - 1]);
        }
        vector<int> vec;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) {
                vec.push_back(i + 1);
            }
        }
        return vec;
    }
};

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇