leetcode刷题(001-003)

  • 这个系列是为了笔试快速刷题
  • 不定期、不定量、不定时,不高效
  • 使用C++

1.两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

代码:

利用关联容器unorder_map做中间变量,因为此容器查找速度很快,提升时间复杂度。

<u>学习到了map容器的使用</u>

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

class Solution{
  public:
    vector<int> twoSum(vector<int>& nums, int target) {
        //利用关联容器寻找,其实用其它数据结构都可以,只不过速度快而已
            unordered_map<int, int> lookup;
            for (int i = 0; i < nums.size(); ++i) {
                //目标值减去当前值,剩下的值再去寻找
                if (lookup.count(target - nums[i])) {
                    return {lookup[target - nums[i]], i};
                }
                lookup[nums[i]] = i;//数值和下标关联
            }
            return {};
        }
};

int main(int argc, char *argv[])
{
    Solution test;
    int data[8] = {2, 1, 11, 15,3,4,6,7};
    vector<int> input(data , data+8);
    vector<int> result = test.twoSum(input,9);
    return 0;
}

2.两数相加

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

代码:

主要利用一个进位标志位去做

<u>多使用auto自动获取数据类型</u>

<u>等号的优先级低于问号的优先级</u>

#include <iostream>

using namespace std;

//定义一个链表节点
struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x):val(x),next(NULL)
    {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode dummy{0};
        auto curr = &dummy;//自动判断类型

        auto carry = 0;
        //两个链表和进位标志位只要有一个不为空都可以计算
        while (l1 || l2 || carry) {
            auto a = l1? l1->val : 0, b = l2? l2->val : 0;
            auto val = carry + a + b;
            curr->next = new ListNode(val % 10);
            carry = val / 10;
            l1 = l1 ? l1->next : nullptr;//等号优先级比问号优先级低!!!
            l2 = l2 ? l2->next : nullptr;
            curr = curr->next;
        }

        return dummy.next;
    }
};
int main(int argc, char *argv[])
{
    ListNode t10(2),t11(4),t12(3),t20(5),t21(6),t22(7);

    t10.next=&t11;
    t11.next=&t12;
    t20.next=&t21;
    t21.next=&t22;

    Solution test;
    ListNode* result = test.addTwoNumbers(&t10,&t20);
    return 0;
}

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

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke"子序列 而不是子串。

代码:

利用unorder_map加快速度,再用一个位置标志位(重复的位置)+一个长度标志位

<u>换位思考</u>

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // Record the last occurrence of each char.
        unordered_map<char, size_t> last_occurrence;
        size_t starting_idx = 0, ans = 0;
        for (size_t i = 0; i < s.size(); ++i) {
            auto it = last_occurrence.find(s[i]);//返回迭代器
            if (it == last_occurrence.cend()) {//如果字符不重复
                last_occurrence.emplace_hint(it, s[i], i);
                //last_occurrence.emplace(s[i],i);
            } else {  // s[i] appeared before. Check its validity.
                if (it->second >= starting_idx) {
                    ans = max(ans, i - starting_idx);
                    starting_idx = it->second + 1;
                }
                it->second = i;
            }
        }
        ans = max(ans, s.size() - starting_idx);
        return ans;
    }
};

int main(int argc, char *argv[])
{
    string a = "bfadajkbplx";
    Solution test;
    size_t result = test.lengthOfLongestSubstring(a);



    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 旅途难耐,尤其是失眠的晚上,翻来覆去间,回想起,人生第一次坐火车的场景。 其实我们家并不算多么闭塞...
    纪娟阅读 195评论 0 0
  • ◆ 蔓越莓饼干 食材: 低筋面粉120克、糖粉60克、黄油75克、蛋黄2个、蔓越莓干35克 做法: 1、蛋黄搅散,...
    味博士阅读 368评论 2 5
  • 昨日约着朋友去公园看桃花。自打读完《桃夭》,对桃花就有种莫名的偏爱,前不久大火的《三生三世》,在我的这份喜爱上又猛...
    背着冬粮的蚂蚁阅读 257评论 0 0
  • 年初的时候,在日记本上写下年度计划,其中一项是希望能有一次徒步,说来奇妙,就这样爱上了户外运动。 三...
    一橙子阅读 211评论 1 0
  • 初良久第一次知道咖喱饭这种东西是在立冬的那晚。想家的一弯敲开自己房门讨一壶酒,也是无奈,自从蔷薇告诉大家他的朋友是...
    Sprite雪碧阅读 501评论 1 3