LeetCode 算法题 1~3 题 C++

1. 两数之和

将数组中所有的数插入到一个unordered_map(哈希表)中, 在插入之前在哈希表中查找一下, 是否存在一个值等于 target - nums[i] , 如果有就直接返回.

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> heap;
        for (int i = 0; i < nums.size(); ++ i)
        {
            int r = target - nums[i];
            if (heap.count(r))  return { heap[r], i };
            heap[nums[i]] = i;
        }
        return {};
    }
};

2. 两数相加

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *newList = new ListNode(-1);
        ListNode *tail = newList;
        int tmp = 0;
        while (l1 || l2 || tmp)
        {
            if (l1) 
            {
                tmp += l1->val;
                l1 = l1->next;
            }
            if (l2)
            {
                tmp += l2->val;
                l2 = l2->next;
            }
            tail = tail->next = new ListNode(tmp % 10);
            tmp /= 10;
        }
        tail = newList->next;
        delete newList;
        return tail;
    }
};

3. 无重复字符的最长子串

这道题目这里分享两种解法, 第一种就是暴力枚举, 两层for循环, 去看从每一个位置开始未出现相同字符的子字符串就行.

第二种就是双指针, 滑动窗口, 我们先看算法的原理

当我们扫描到 i 的时候, 假设 j 位置是 到达 i 位置, 最长的无重复的子串, 那么当 i 向后走一步 到 i + 1的时候, 最长的子串仍然是 从 j 位置到 i + 1 位置, 为什么不会出现 j - 1或者之前的位置呢?

因为我们之前的假设, j 位置是 到达 i 位置, 最长的无重复的子串, 那么当 i 向后走一步 到 i + 1 如果出现在了 j - 1或者更之前的位置, 那么必然 j 位置不是 到达 i 位置的最长的无重复的子串, 而是从j - 1或者更之前的位置是最长的无重复的子串.

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> heap;
        int res = 0;
        for (int i = 0, j = 0; i < s.size(); ++i)
        {
            heap[s[i]] ++;
            while (heap[s[i]] > 1) heap[s[j ++]] --;
            res = max(res, i - j + 1);
        }
        return res;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值