美文网首页
2022-08-11 真实题目

2022-08-11 真实题目

作者: Tomasmule | 来源:发表于2022-08-15 14:36 被阅读0次
  1. 无重复字符的最长子串](https://leetcode.cn/problems/longest-substring-without-repeating-characters/)
    给定一个字符串 s ,请你找出其中不含有重复字符的 **最长子串 **的长度。

  2. hash set space O(n), time O(|n|) n string len, |n| char set

  3. dynamic time O(n2) , space O(n)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.length() <= 1) {
            return s.length();
        }
        vector<int> dp(s.length(), 0);
        dp[0] = 1;
        int imx = 0;
        for (int i = 1; i < s.length(); i++) {
            int j = i - 1;
            while (j >= 0 && s[j] != s[i]) {
                j--;
            }
            dp[i] = dp[i - 1] < i - j ? dp[i - 1] + 1 : i - j;
            imx = max(imx, dp[i]);
        }
        return imx;
    }
};
  1. 给两组数据,order = {time stamp, customer id, order id}, sale ad event = {time stamp, customer id, event id}, 给每一个order找之前最近的sale ad event or null if not found.
    例如 order = {100, 1, 20}, sale event ad = {{90, 1, 33}, {110, 1, 45}}, 那么合适的sale ad event 是{90, 1, 33}
    return type需要自己定义,需要同时return order and its matching sale event ad.

sort -> binary search

struct Node{
     long long timeStam;
     long long id;
     long long orderid;
      operator < (const Node &a) {
            timeStam < a.timeStam;
       }
      operator > (const Node &a) {
            timeStam > a.timeStam;
       }
};
sort(nodes.begin(), nodes.end());

bs(node, 0, nodes.size(), target);

  1. LRU 缓存
typedef struct NodeSt {
    struct NodeSt* pre;
    struct NodeSt* next;
    int key;
    int val;
    NodeSt(int key, int val):pre(NULL), next(NULL) {
        this->key = key;
        this->val = val;
    }
}Node;

LRUCache(int capacity): size(0)
int get(int key)
void put(int key, int value)
void moveToTail(Node* n)
void pushToTail(Node* n)
void removeFromHead()
private:
    unordered_map<int, Node*> table;
    Node *head;
    Node *tail;
    int size;
    int capacity;

  1. 1487 保证文件名唯一

给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。

由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。

返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。

unorder_map<string, sub> mp;

5pre. 单词拆分 O(n2) space O(n)

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> mp;
        for (int i = 0; i < wordDict.size(); i++) {
            mp.insert(wordDict[i]);
        }
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int j = 0; j <= s.size(); j++) {
            for (int i = 0; i < j; i++) {
                if (!dp[i]) {
                    continue;
                }
                string str = s.substr(i, j - i);
                dp[j] = dp[i] & (mp.count(str));
                if (dp[j]) {
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};
  1. 472 连接词
    给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。
    pre的进阶, 遍历一遍数组。。
class Solution {
public:
    bool check(string s , unordered_set<string> &mp)
    {
        mp.erase(s);
        vector<int> dp(s.size() + 1, 0);
        dp[0] = 1;
        for (int j = 1; j <= s.size(); j++) {
            for (int i = 0; i < j; i++) {
                if (dp[i]) {
                    string str = s.substr(i, j - i);
                    if (mp.count(str)) {
                        dp[j] = true;
                        break;
                    }
                }
            }
        }
        mp.insert(s);
        return dp[s.size()];
    }
    vector<string> findAllConcatenatedWordsInADict(vector<string>& words) {
        vector<string> ret;
        unordered_set<string> mp;
        for (string s : words) {
            mp.insert(s);
        }
        for (string s : words) {
            if (check(s, mp)) {
                ret.push_back(s);
            }
        }
        return ret;
    }
};
  1. 295 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
class MedianFinder {
public:
    MedianFinder() {

    }
    
    void addNum(int num) {
        if (maxheap.empty()) {
            maxheap.push(num);
            return;
        }
        int k = maxheap.top();
        if (num <= k) {
            maxheap.push(num);
        } else {
            minheap.push(num);
        }
        // adjust
        int a = minheap.size();
        int b = maxheap.size();
        while (abs(a - b) > 1) {
            if (minheap.empty()) {
                int t2 = maxheap.top();
                maxheap.pop();
                minheap.push(t2);
                a = minheap.size();
                b = maxheap.size();
                continue;
            }
            int t1 = minheap.top();
            int t2 = maxheap.top();
            if (a > b) {
                minheap.pop();
                maxheap.push(t1);
            } else {
                maxheap.pop();
                minheap.push(t2);
            }
            a = minheap.size();
            b = maxheap.size();
        }
        
    }
    
    double findMedian() {
        if (minheap.size() == maxheap.size()) {
            int t1 = minheap.top();
            int t2 = maxheap.top();
            return (double)(t1 + t2) / 2;
        }
        if (minheap.size() > maxheap.size()) {
            return minheap.top();
        }
        return maxheap.top();
    }
private:
    priority_queue<int, vector<int>, greater<int>> minheap;
    priority_queue<int> maxheap;
};

罗马数字,注意时间,空间复杂度都是O(1)

class Solution {
public:
    string intToRoman(int num) {
        string ret;
        vector<int> sub = {
            1,4,5,9,10,40,50,90,100,400, 500, 900, 1000
        };
        map<int,string> mp = {
            pair(1, "I"),
            pair(4, "IV"),
            pair(5, "V"),
            pair(9, "IX"),
            pair(10, "X"),
            pair(40, "XL"),
            pair(50, "L"),
            pair(90, "XC"),
            pair(100, "C"),
            pair(400, "CD"),
            pair(500, "D"),
            pair(900, "CM"),
            pair(1000, "M")
            };
        // O(1)
            for (int i = sub.size() - 1; i >= 0; i--) {
                while (num >= sub[i]) {
                    num -= sub[i];
                    ret += mp[sub[i]];
                }
                if (num == 0) {
                    break;
                }
            }
        return ret;

    }
};

45 跳跃游戏II greed(贪心)

    int jump(vector<int>& nums)
    {
        int imx = 0;
        int end = 0;
        int ans = 0;
        int j = 0;
        vector<int> pos;
        for (int i = 0; i < nums.size() - 1; i++) {
            if (imx < i + nums[i]) {
                j = i;
                imx = i + nums[i];
            }
            if (i == end) {
                end = imx;
                imx = 0;
                ans++;
                pos.push_back(nums[j]);
            }
        }
        pos.push_back(nums[nums.size() - 1]);
        return ans;
    }

994 腐烂的橘子

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        vector<pair<int,int>> dir = {
            {1,0},
            {0,1},
            {-1, 0},
            {0, -1}
        };
        // bfs
        // init
        queue<pair<int,int>> que;
        int m = grid.size();
        int n = grid[0].size();
        int miu = 0;
        int cnt = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 2) {
                    que.push(pair(i, j));
                } else if (grid[i][j] == 1) {
                    cnt++;
                }
            }
        }
        // bfs

        while (cnt && !que.empty()) {
            int len = que.size();
            miu++;
            for (int i = 0; i < len; i++) {
                auto bad = que.front();
                
                // search in 4 dir & push new bad
                for (int d = 0; d < 4; d++) {
                    int x = bad.first + dir[d].first;
                    int y = bad.second + dir[d].second;
                    if (!(x < m && y < n && x >= 0 && y >= 0)) {
                        continue;
                    }
                    if (grid[x][y] == 1) {
                        grid[x][y] = 2;
                        cnt--;
                        que.push(pair(x, y));
                    }
                }
                que.pop();
            }
        }

        // check all grid, and no == 1, return min, else return -1
        if (cnt > 0) {
            return -1;
        }
        // first que element is aready bad.
        return miu;
    }
};

相关文章

网友评论

      本文标题:2022-08-11 真实题目

      本文链接:https://www.haomeiwen.com/subject/pzuqbrtx.html