2022.02.04 Day1

前言

为日后的算法面试做准备,自己也很喜欢算法这个东西,每天3~5道题。

刷题

1.leetcode 209 长度最下的子数组

题目

长度最下的子数组
大致的意思是从数组中找到长度最小的数组,并且数组内的和是大于等于给定的数target

思路

最基本的思路当然是双重遍历,时间复杂度是O(N2),但是本题的数据大小为105,所以这是肯定过不掉的,所以我们需要优化。
我们可以发现的是,对于满足条件的某个区间,区间左右端点分别ij其中i表示最接近j的那个数的下标,当j向右移动的时候,i也会向右移动或者原地不动。所以我们可以用双指针来优化这个到O(N)。

代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int res = INT_MAX;
        //每次找的是能处于最左边的数
        for(int i = 0, j = 0,sum_ = 0; j < nums.size();++j){
            sum_ += nums[j];
            while(sum_ - nums[i] >= target) sum_ -= nums[i++];
            if(sum_ >= target)res = min(res, j - i + 1);
        }
        /*对于每个nums[j]找到的nums[i]是离nums[j]最近的那个满足sum_ >= target的数
        每次这样维护是最小的
        */
        if(res == INT_MAX) res = 0;
        return res;
    }
};

2.leetcode 208 实现Trie(前缀树)

题目

实现Trie(前缀树)

思路

就是Trie的模板题,我习惯用数组来模拟Trie树,所以打个板子题就好了,要用个check数组来维护一下最后一个数即可,大概把数据范围定在在8e4以上就可以过了。不过实测发现8e41e5的运行速度不一样,后者会快个20多ms,可能是因为在解析8e4的时候会慢一点?
然后有个细节是,用bool类型的check数组,因为bool的大小是1个字节,会相对于int小一点,在内存上会更加占优。

代码

const int N = 1e5;
int son[N][26], idx = 0;
bool check[N];

class Trie {
public:
    Trie() {
        memset(son, 0 ,sizeof(son));
        memset(check, 0 ,sizeof(check));
    }
    
    void insert(string word) {
        int pos = 0;
        for(int i = 0; word[i]; ++ i){
            int temp = word[i] - 'a';
            if(!son[pos][temp]) son[pos][temp] = ++idx;
            pos = son[pos][temp];
            //check[pos] = 1;
        }
        check[pos] = 1;
    }
    
    bool search(string word) {
        int pos = 0;
        for(int i = 0; word[i]; ++ i){
            int temp = word[i] - 'a';
            if(!son[pos][temp]) return false;
            pos = son[pos][temp];
        }        
        if(check[pos]) return true;
        else return false;
    }
    
    bool startsWith(string prefix) {
        int pos = 0,temp;
        for(int i = 0; prefix[i]; ++ i){
            temp = prefix[i] - 'a';
            if(!son[pos][temp]) return false;
            pos = son[pos][temp];
        }  
        return true;
    }
};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */
上一篇:每日刷题 Day22


下一篇:koa express 优缺点