LeetCode(CPP):一月刷完热题100(1)

博主分享了在LeetCode上刷题的经验,第一部分详细探讨了如何使用暴力枚举和哈希表解决两数之和问题,解释了双循环的时间复杂度和哈希表的高效查找。接着介绍了两数相加的链表解决方案,最长无重复字符子串的滑动窗口方法,以及寻找两个正序数组中位数的二分查找策略。文章以轻松幽默的风格展开,适合学习算法的读者。
摘要由CSDN通过智能技术生成

开玩笑的,我一个月刷不完

1. 两数之和(easy)

不要给我说什么哈希查找,我不懂。看到题,啪一下就想到了两层暴力循环,注意很快哈。

1. 暴力枚举

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>& num=nums;
        for(int i=0;i<num.size();i++)
        {
            for(int j=1;j<num.size();j++)
            {
                if(num[i]+num[j]==target&&i!=j)//for (int j = i + 1; j < n; ++j)
                {
                    return{i,j};
                }
            }
        }
        return{};
    }
};

这种双循环时间复杂度为n方

2. 哈希表

// 哈希表(集合),用来记录每个字符是否出现过
// 哈希表的散列技术是指在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每一个关键字都对应一个存储位置

思路:

快速查找某个元素采用哈希查找,采用unordered_map,这种一个key对应一个value的容器;

首先对数组进行遍历,在第i次遍历中,都去找target-nums[i]这个数是否存在;

如果再遍历一遍查找就是暴力枚举的办法,而采用哈希表查找就是哈希表法;

这是一种边赋值边查找的方式,注意不是从原数组中查找,而是从哈希表中查找:

注意要定义一个哈希表的迭代器it来返回下标。

Eg:target=8:

nums[0]=6,需要找2,哈希表中没有,则存入key为nums[0],value为其在数组中的下标值0;nums[1]=3,需要找7,哈希表中没有,则存入key为nums[1],value为其在数组中的下标值1;nums[2]=8,需要找0,哈希表中没有,则存入key为nums[2],value为其在数组中的下标值2;nums[3]=2,需要找6,哈希表中有,则输出key为6时对应的value,即为其在数组中的下标;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};
class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

//unordered_map<first_type,second_type> 
//无序哈希表提供一种一个key对应一个value,用于快速查找

        unordered_map<int, int> hashtable;

        for (int i = 0; i < nums.size(); ++i) {

//采用find函数查找是否有value: “目标值减去当前nums[i]”

            auto it = hashtable.find(target - nums[i]);

//如果it在没到达末尾之前找到,则返回it所对应的value和i,it->second表示it迭代器指向的value。

            if (it != hashtable.end()) {//这是判断哈希表是否查找到常用方式

                return {it->second, i};

            }

//下标i是hash值,nums[i]是key值,通过key(nums[i])值找到value(i),返回i

//将 nums[i] 插入到哈希表中,即可保证不会让 x 和自己匹配。
//即边赋值边进行查找,为了避免重复值,因此实在循环之后才进行传值

//因为是要返回下标i,所以在哈希表中存入key=nums[i],value=i。
//就是通过需要找到的 “目标值减去当前nums[i]”值 找下标值i.

            hashtable[nums[i]] = i;

        }

        return {};

    }

};

时间复杂度和空间复杂度均为n。 


2. 两数相加(mid)

思路: 

首先创建一个新的链表,头结点指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值