Leetcode448. 找到所有数组中消失的数字(HOT100)+Leetcode139. 单词拆分(HOT100)

链接 链接2

这两道题略微有点难,其中第一道题我自己解出来了,还补充了一个更好的解法,在空间上做了优化。

第二道题看了别人的题解,我正在努力理解。

题目一:

题意:为什么有n个元素,但是还有一些元素不存在呢?原因是有些元素重复了,比如2 2 3,2把1的位置给占了。

我的代码:

cpp 复制代码
class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        int n = nums.size();
        unordered_set<int> s;
        for(const auto&e:nums){
            s.insert(e);
        }
        vector<int> res;
        for(int i = 1;i<=n;i++){
            if(!s.count(i)){
                res.push_back(i);
            }
        }
        return res;
    }
};

更好的实现,对于空间做了优化:

cpp 复制代码
class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        for(auto e:nums){
            e = abs(e);
            if(nums[e-1]>0)nums[e-1]*=-1;
        }
        vector<int> res;
        for(int i = 0;i<nums.size();i++){
            if(nums[i]>0){
                res.push_back(i+1);
            }
        }
        return res;
    }
};

还挺难理解的,我使用了两种方法帮助我理解它:

1)

可以使用一个数组来调试模拟一下过程,具体调试过程如下:

这次调试帮助我理解了代码本身:

首先我们利用范围for从数组中取出元素,注意这个nums[e-1] 。【由于我们是以下标来访问数组,可是nums数组本来值都是大于等于1的,所以我们要[e-1]。否则你访问不到nums[0],却访问到了nums[n]越界了】

另外,e要取绝对值,因为e有可能在if 条件中已经被变为相反数了,真实的数是它的绝对值。

继续:第二次for循环,最后push_back时应该把i +1 push进去,注意 i 是下标。比如我的调试结果中最后返回的结果是5 6,他俩对应原数组nums[4] nums[5] 的索引再加一。而不是nums[4] nums[5]的 元素8 和 元素2。

2)在纸上模拟:

以该数组为例:


题目二:

cpp 复制代码
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        const int P = 131;
        typedef unsigned long long ULL;
        unordered_set<ULL> hash;
        for(auto& word:wordDict){
            ULL h = 0;
            for(auto c:word){
                h = h*P + c;
            }
            hash.insert(h);
        }
        //至此将wordDict中的字符串哈希之后放在了hash中。
        int n = s.size();
        vector<bool> v(n+1);
        v[0] = true;
        s = ' '+s;
        for(int i = 0;i<n;i++){
            if(v[i]){
                ULL h = 0;
                for(int j = i+1;j<=n;j++){
                    h = h*P +s[j];
                    if(hash.count(h)){
                        v[j] = true;
                    }
                }
            }
        }
        return v[n];
    }
};
https://www.acwing.com/video/1505/
相关推荐
Fuxiao___7 分钟前
C 语言核心知识点讲义(循环 + 函数篇)
算法·c#
Mr_Xuhhh33 分钟前
LeetCode hot 100(C++版本)(上)
c++·leetcode·哈希算法
漫随流水37 分钟前
c++编程:反转字符串(leetcode344)
数据结构·c++·算法
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.03.31):字典序最小的生成字符串
算法·leetcode
CoovallyAIHub4 小时前
VisionClaw:智能眼镜 + Gemini + Agent,看一眼就能帮你搜、帮你发、帮你做
算法·架构·github
Titan20244 小时前
map和set的封装学习笔记
数据结构·c++
CoovallyAIHub4 小时前
低空安全刚需!西工大UAV-DETR反无人机小目标检测,参数减少40%,mAP50:95提升6.6个百分点
算法·架构·github
CoovallyAIHub4 小时前
IEEE Sensors | 湖南大学提出KGP-YOLO:先定位风电叶片再检测缺陷,三数据集mAP均超87%
算法
Yupureki5 小时前
《算法竞赛从入门到国奖》算法基础:动态规划-路径dp
数据结构·c++·算法·动态规划
副露のmagic5 小时前
数组章节 leetcode 思路&实现
算法·leetcode·职场和发展