LeetCode刷题笔记-数据结构-day2

Posted LL.LEBRON

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题笔记-数据结构-day2相关的知识,希望对你有一定的参考价值。

文章目录

LeetCode刷题笔记-数据结构-day2

75.颜色分类

1.题目描述

原题链接:75. 颜色分类

2.解题思路

算法:双指针算法

题目要求:不使用内置排序函数。使用常数空间

具体思路:

  1. 假设数组长度为n。使用三个指针 i、j、k,初始化i=0、j=n-1、k=0

  2. k开始遍历,分三种情况:

    1. 如果a[k]==0swap(a[i++],a[k++]);

      这里a[i]一定是不等于2的。因为如果等于2,会执行第二种操作,所以不可能为2

      所以a[i]==1,a[k]==0,因此交换后,ik都可以往后移一位

    2. 如果a[k]==2swap(a[j--],a[k]);

      因为这里a[j]的值可能也是2,所有这里k交换后不能往后移。

    3. 如果a[k]==1k++;

3.代码

class Solution 
    public:
    void sortColors(vector<int>& a) 
        int n=a.size();
        int i=0,j=n-1,k=0;
        while(k<=j)
            if(a[k]==0) swap(a[i++],a[k++]);
            else if(a[k]==2) swap(a[j--],a[k]);
            else k++;
        
    
;

56.合并区间

1.题目描述

原题链接:56. 合并区间

2.解题思路

直接套用区间合并的模板即可:

// 将所有存在交集的区间合并
void merge(vector<PII> &segs)

    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        
            if (st != -2e9) res.push_back(st, ed);
            st = seg.first, ed = seg.second;
        
        else ed = max(ed, seg.second);

    if (st != -2e9) res.push_back(st, ed);

    segs = res;

3.代码

class Solution 
public:
    vector<vector<int>> merge(vector<vector<int>>& v) 
        vector<vector<int>> res;
        sort(v.begin(),v.end());
        int st=-2e9,ed=-2e9;
        for(auto x:v)
            if(ed<x[0])
                if(st!=-2e9) res.push_back(st,ed);
                st=x[0],ed=x[1];
            
            else ed=max(x[1],ed);
        
        if(st!=-2e9) res.push_back(st,ed);
        return res;
    
;

706.设计哈希映射

原题链接:706. 设计哈希映射

1.题目描述

2.解题思路

题目要求:不使用任何内建的哈希表库设计一个哈希映射(HashMap)

具体思路:

哈希表的基本思想都是先开一个大数组,然后用某种哈希函数将key映射到数组的下标空间。不同算法的区别在于如何处理下标冲突,即当两个不同的key被映射到同一下标时。我们这里使用拉链法解决冲突。这里的链表我们可以用vector实现。

  • 对于put(key, value)操作,我们先求出key的哈希值,然后遍历该位置上的链表,如果链表中包含key,则更新其对应的value;如果链表中不包含key,则直接将(key,value)插入该链表中。
  • 对于get(key)操作,求出key对应的哈希值后,遍历该位置上的链表,如果key在链表中,则返回其对应的value,否则返回-1。
  • 对于remove(key),求出key的哈希值后,遍历该位置上的链表,如果key在链表中,则将其删除。

3.代码

const int N=1e4+3;
class MyHashMap 
public:
    vector<pair<int,int>> h[N];
    MyHashMap() 

    
    int find(vector<pair<int,int>> &h,int key)
        for(int i=0;i<h.size();i++)
            if(h[i].first==key) return i;
        return -1;
    
    void put(int key, int value) 
        int t=key%N;
        int k=find(h[t],key);
        if(k==-1) h[t].push_back(key,value);
        else h[t][k].second=value;
    
    
    int get(int key) 
        int t=key%N;
        int k=find(h[t],key);
        if(k==-1) return -1;
        return h[t][k].second;
    
    
    void remove(int key) 
        int t=key%N;
        int k=find(h[t],key);
        if(k!=-1) h[t].erase(h[t].begin()+k);
    
;

以上是关于LeetCode刷题笔记-数据结构-day2的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-动态规划-day2

LeetCode刷题笔记-动态规划-day2

leetcode刷题day2

leetcode刷题day2

LeetCode刷题笔记-数据结构-day5

LeetCode刷题笔记-数据结构-day19