Leetcode Top 100 Liked Questions(序号236~347)

news2024/11/29 4:52:21

236. Lowest Common Ancestor of a Binary Tree

题意:二叉树,求最近公共祖先,All Node.val are unique.

我的思路

首先把每个节点的深度得到,之后不停向上,直到val相同,存深度就用map存吧

但是它没有向上的指针,要如何解决?——用map<int,int>存一下父节点?

返回的是指针,注意一下

代码 Runtime28 ms Beats 5.86% Memory17.7 MB Beats 5.56%

class Solution {
public:
    unordered_map<int,int>dep; 
    unordered_map<TreeNode*,TreeNode*>fa;
    void dfs(TreeNode* root,int dp){
        if(root==NULL)return;
        dep[root->val]=dp;
        if(root->left)fa[root->left]=root;
        if(root->right)fa[root->right]=root;
        dfs(root->left,dp+1);  dfs(root->right,dp+1);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root,0);
        while(dep[p->val]!=dep[q->val]){
            if(dep[p->val]>dep[q->val]) p=fa[p];
            else q=fa[q];
        }
        while(p!=q){
            p=fa[p];q=fa[q];
        }
        return p;
    }
};

标答 递归 

情况1:如果p==root||q==root,那就返回root;这里的root是正解

情况2:是指同一层级但不同的指针,而root就是它们的祖先

情况3:p和q都在lca1这里,lca2为NULL不返回

情况4:和情况3类似

代码 Runtime13 ms Beats 73.18% Memory14.2 MB Beats 49.26%

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root)return root;
        if(root->val == p->val || root->val == q->val)return root;//情况1
        TreeNode* lca1=lowestCommonAncestor(root->left,p,q);
        TreeNode* lca2=lowestCommonAncestor(root->right,p,q);
        if(lca1!=NULL&&lca2!=NULL)return root;//情况2
        if(lca1!=NULL)return lca1;//情况3
        return lca2;//情况4
    }
};

标答 另一种的不用遍历

用stack来辅助建立每个指针的父指针,这样就不用把整棵树都建完;根据下面的代码来说不能用queue,因为用栈代表的是DFS,而queue就是层序遍历,这样循环终止判断条件mp.find(p)==mp.end() || mp.find(q)==mp.end()就是错误的了

之后用set来每个指针向上,这样就不需要dep了

代码 Runtime24 ms Beats 11.11% Memory17.3 MB Beats 7.82%

class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*> s; unordered_map<TreeNode*,TreeNode*> mp;
        mp[root]=NULL; s.push(root);
        while(mp.find(p)==mp.end() || mp.find(q)==mp.end()){
            TreeNode *t=s.top(); s.pop();
            if(t->left){
                mp[t->left]=t; s.push(t->left);
            }
            if(t->right){
                mp[t->right]=t; s.push(t->right);
            }
        }
        set<TreeNode*> sett;
        while(p!=NULL){
            sett.insert(p); p=mp[p];
        }
        while(sett.find(q)==sett.end()){
            q=mp[q];
        }
        return q;
    }
};

238. Product of Array Except Self

题意:给一个数组a,返回一个数组ans,ans[i]等于除了a[i],其他数的值

我的思路

先判断有多少个0,两个的话都输出0;1个的话,其余的是0,其中一个是除它以外的积;

没有0,那就总积/当前的数

写完了才发现不让用除法

代码 Runtime 11 ms Beats 98.32% Memory24 MB Beats 79.45%

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int zero=0;int mul=1;
        for(int i=0;i<nums.size();i++){
            if(!nums[i])zero++;
            else mul=mul*nums[i];
        }
        vector<int> ans(nums.size(),0);
        if(zero>1)return ans;
        for(int i=0;i<nums.size();i++){
            if(zero&&!nums[i])ans[i]=mul;
            else if(!zero)ans[i]=mul/nums[i];
        }
        return ans;
    }
};

标答 前缀积与后缀积

就是普通的做,最后把空间优化了

代码 Runtime14 ms Beats 93.5% Memory24 MB Beats 79.45%

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> output(n);
        output[0] = 1;
        for(int i=1; i<n; i++){
            output[i] = output[i-1] * nums[i-1];
        }
        int right = 1;
        for(int i=n-1; i>=0; i--){
            output[i] *= right;
            right *= nums[i];
        }
        return output;
    }
};

239. Sliding Window Maximum

题意:滑动窗口求最大 

我的思路

我记得是用队列做的,因为要求最大值,但是忘了,只记得队列里放的是序号

用单调栈能做吗?不能,例如7 6 5 4 3 2 1 

只放比队尾大的数 7 6 5 4 3 2 1 不行

后面想了想,只放比队尾小的数 7 6 5 4 3 2 1好像可以,毕竟是求最大值

标答 优先队列 O(nlogn)

初始化pair型的优先队列,答案ans;把k个{数字,序号}放入队列,ans[0]是优先队列的最大的

遍历nums数组,如果优先队列不为空,并且顶部的数字已经小于等于i-k了,那就把顶部的数字不断弹出,之后放入pair,更新答案

代码 Runtime231 ms Beats 48.99% Memory148.9 MB Beats 26.27%

class Solution {
public:
    #define pii pair<int,int> 
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        priority_queue<pii,vector<pii>,less<pii>> q;
        int n=nums.size();
        vector<int> ans;
        for(int i=0;i<k;i++) q.push({nums[i],i});
        ans.push_back(q.top().first);
        for(int i=k;i<n;i++){
            while(!q.empty()&&q.top().second<=i-k)
                q.pop();    //注意上面的等号,queue只能有(i-k,i]之间的数
            q.push({nums[i],i});
           ans.push_back(q.top().first);
        }
        return ans;
    }
};

标答 双端队列

初始化双端队列dq和答案数组ans,在k个数以内如果之后的数比队尾大,那么把队尾的数弹出,之后加入(像单调栈一样,队列里的值是从大到小)ans[0]是队首的值,遍历剩下的数组,如果队首的序号超过范围里,把它弹出,如果新来的数比队尾大,那么把队尾的数弹出,最后更新答案

代码 Runtime190 ms Beats 90.70% Memory134.7 MB Beats 72.95%

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> q;vector<int>ans;//q里面放序号
        int n=nums.size();
        for(int i=0;i<k;i++){
            while(!q.empty()&&nums[q.back()]<=nums[i])q.pop_back();
            q.push_back(i);
        }
        ans.push_back(nums[q.front()]);
        for(int i=k;i<n;i++){
            if(q.front()<=i-k)q.pop_front();
            while(!q.empty()&&nums[q.back()]<=nums[i])q.pop_back();
            q.push_back(i);
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};

标答 左指针

初始化max_idx数组(模拟双端队列),ans数组,left指针,

注意 如果直接vector<int> ans(n-k+1);来初始化ans,可以减少内存的使用

代码 Runtime 173 ms Beats 98.6 Memory 129.7 MB Beats 99.17%

class Solution {
public:
    int n;
    vector<int> max_idx;//array storing index for max
    int left=0;
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        n=nums.size();       
        vector<int> ans(n-k+1);
        for(int i=0;i<k;i++){
            while(max_idx.size()>left && nums[i]>=nums[max_idx.back()]) 
                max_idx.pop_back();// pop back the indexes for smaller ones
            max_idx.push_back(i);  // push back the index for larger one
        }
        ans[0]=nums[max_idx[left]];   
        for(int i=k; i<n; i++){
            while(max_idx.size()>left && nums[i]>=nums[max_idx.back()]) 
                max_idx.pop_back();// pop back the indexes for smaller ones
            max_idx.push_back(i);  // push back the index for larger one
            if (max_idx[left]==i-k) left++; 
            ans[i-k+1]=nums[max_idx[left]];     
        }
        return ans;
    }
};

240. Search a 2D Matrix II

题意:给一个行和列都升序的矩阵,找target是否在矩阵中

我的思路

和之前不一样的是最左边一列不是索引,所以要nlogm

代码 Runtime 184 ms Beats 21.13% Memory 14.8 MB Beats 88.10%

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n=matrix.size();int q=0;
        int m=matrix[0].size();
        for(int q=0;q<n;q++){
            int l=0,r=m-1;
            while(l<=r){
                int mid=(l+r)/2;
                if(matrix[q][mid]<target) l=mid+1;
                else if(matrix[q][mid]==target) return 1;
                else r=mid-1;
            }
        }
        return 0;
    }
};

标答

因为行从小到大排列,列也是从小到大排列,所以可以从左上角或者右上角开始找,假设从左下角开始找,找小的行--,找大的列++,O(n+m)

代码 Runtime88 ms Beats 72.75% Memory14.9 MB Beats 47.68%

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& ma, int tar) {
        int m=ma[0].size(),n=ma.size();
        int row=n-1,col=0;
        while(row>=0&&col<m){
            if(ma[row][col]>tar)row--;
            else if(ma[row][col]<tar)col++;
            else return 1;
        }
        return 0;
    }
};

神奇的优化 在最后加上ma.clear()会使时间大幅度减少

试了试第215题,第131题是可行的,但第72题,第53题就不行

补充知识:STL中的隐性性能开销与副作用 

代码 Runtime21 ms Beats 99.80% Memory14.9 MB Beats 47.68%

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& ma, int tar) {
        int m=ma[0].size(),n=ma.size();
        int row=n-1,col=0;
        while(row>=0&&col<m){
            if(ma[row][col]==tar){ma.clear();return 1;}
            if(ma[row][col]>tar)row--;
            else col++;
        }
        ma.clear();
        return 0;
    }
};

283. Move Zeroes

题意:把0都放在最后

我的思路

想过荷兰国旗算法,但是这样就把非0的顺序打乱了,所以不会做

标答

就是简单的思维题

代码 Runtime12 ms Beats 94.45% Memory19.2 MB Beats 34.86%

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int j=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i])
                nums[j++]=nums[i];
        }
        for(;j<nums.size();j++)nums[j]=0;
        return ;
    }
};

287. Find the Duplicate Number

题意:一个数组,有一个数出现了多次,返回这个数

我的思路

开一个vis看有无重复;用上了取消同步和clear

代码 Runtime37 ms Beats 100% Memory61 MB Beats 98.76%

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        bool vis[100005]={0};
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        for(int i=0;i<nums.size();i++){
            if(vis[nums[i]]){nums.clear();return nums[i];}
            vis[nums[i]]=1;
        }
        return -1;
    }
};

标答 快慢指针

定义快指针和慢指针,就是看环的接口处以及之前值相同的地方

以1 3 3 4 2 为例

第一轮 fast=3(1) slow=1

第二轮 fast=2 slow=3

第三轮 fast=4 slow=4

fast=0

fast=1,slow=2

fast=3(1),slow=3(2)

例子

3 1 3 4 2

第一轮 fast=4 slow=3(1)

第二轮 fast=3(2),slow=4

第三轮 fast=2,slow=2

fast=0

fast=3(1) slow=3(2)

代码 Runtime39 ms Beats 99.99% Memory 61 MB Beats 99.82%

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(0);
        int fast = 0; int slow = 0;
        while (true){
            fast = nums[nums[fast]];
            slow = nums[slow];
            if(slow == fast){break;}
        }
        fast = 0;
        while(true){
            fast = nums[fast];
            slow = nums[slow];
            if(fast == slow){nums.clear();return slow;}
        }
    }
};

其他有趣的解法:LeetCode - The World's Leading Online Programming Learning Platform

改变数值不增加空间的:因为1 <= nums[i] <= n,nums.length == n + 1,所以数组中最大的数小于nums.size(),遍历数字,每遍历一个数nums[i],就把nums[nums[i]]变成负的,这样如果遍历到nums[nums[i]]是负的,就返回nums[i]

二分查找、位运算……

295. Find Median from Data Stream

题意:返回中位数

我的思路

对顶堆

代码 Runtime276 ms Beats 74.61% Memory116.8 MB Beats 96.59%

class MedianFinder {
public:
    priority_queue<int,vector<int>,greater<int> >qs;//小的在最上面
    priority_queue<int,vector<int>,less<int> >qb;//大的在最上面
    MedianFinder() {}
    void addNum(int num) {
        if(qs.empty()&&qb.empty())qs.push(num);
        else if(qs.top()<num) qs.push(num);
        else qb.push(num);
        while(qs.size()-1>qb.size()){//4 3 or 3 3 or 3 4都可以
            int tmp=qs.top();qs.pop();qb.push(tmp);
        }
        while(qs.size()+1<qb.size()){
            int tmp=qb.top();qb.pop();qs.push(tmp);
        }
    }
    double findMedian() {
        int sn=qs.size(),bn=qb.size();
        if(sn<bn)return qb.top();
        else if(sn>bn)return qs.top();
        else return 1.0*(qs.top()+qb.top())/2;
    }
};

标答 优化

上面的对顶堆写的有可以改进的地方

1. 维持qs比qb多一个的情况,不用循环【第一次进入的是qs,所以qs比qb多一个】

2. 有了上面的限定,奇数就只要返回qs的顶部就可以了

3. 不用创造变量tmp,直接qb.push(qs.top())放进去就可以了(不知道能否减少时间,但确实少了

以上3个方法在一起 Runtime 253 ms Beats 95.75%

4. 耍赖方法,ios::sync_with_stdio(0)  Runtime 230 ms Beats 99.83% Memory 116.9 MB

代码 Runtime 253 ms Beats 95.75% Memory117 MB Beats 33.29%

class MedianFinder {
public:
    priority_queue<int,vector<int>,greater<int> >qs;//小的在最上面
    priority_queue<int,vector<int>,less<int> >qb;//大的在最上面
    MedianFinder() {}
    void addNum(int num) {
        if(qs.empty()||qs.top()<num)qs.push(num);
        else qb.push(num);
        if(qs.size()-1>qb.size()){//5 3 no
            qb.push(qs.top());qs.pop();
        }
        else if(qs.size()<qb.size()){//3 4-->4 3
            qs.push(qb.top());qb.pop();
        }
    }
    double findMedian() {
        int sn=qs.size(),bn=qb.size();
        if(sn!=bn)return qs.top();
        else return 1.0*(qs.top()+qb.top())/2;
    }
};

300. Longest Increasing Subsequence

题意:严格上升序列的长度

我的思路

动态规划,我记得还有用队列优化,二进制优化(?)和普通dp版本

但我都忘记了

例子一

num[i] 1 10 100 1000 10000 2 3 4 5 6 7 8

dp[i]    1  2    3      4        5     2 3 4 5 6 7 8 

v[i]      0  0    1      2        3     0 5 6 7 8 9 10 

例子二

num[i] 5 6 7 2 1 7 8 9 4

dp[i]    1 2 3 1 1 3 4 5 2

v[i]      # 0 1 # # 1 2 6 3

v[i]要找dp最大的且比自己小的

开一个空间表示比自己小的位置在哪里v[i],dp[i]=dp[v[i]]+1 最后遍历一遍,找个最大的 On^2 ?

---->(详见标答动态规划)

单调栈如何?单调栈5 6 7 2 部分,2会把所有数字都弹出的,不行

双端队列如何?如果比对头小,把对头弹出,加入;如果比队尾大,加入;例子一不行

vector如何?直接二分+插入,二分就用lower_bound

1 10 100 1000 10000

1 2 100 1000 10000

1 2 3 1000 10000

1 2 3 4 10000

1 2 3 4 5

1 2 3 4 5 6……可以

代码 二分 Runtime7 ms Beats 90.93% Memory10.3 MB Beats 87.20%

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> v;
        for(int i=0;i<nums.size();i++){
            int tmp=lower_bound(v.begin(),v.end(), nums[i])-v.begin();
            if(tmp==v.size())v.push_back(nums[i]);
            else v[tmp]=nums[i];
        }
        return v.size();
    }
};

标答 动态规划

初始化dp[0]为1;在[0, i]的序列中,从右向左看,如果nums[j]<nums[i]且dp[j]>dp[i],dp[i]=dp[j];这一步就是上面思路中的v的代替品;最后循环结束,到dp[i]的时候++;

代码 Runtime 171 ms Beats 75.72% Memory10.3 MB Beats 97.68%

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();int dp[2505]={0};
        int ans=1;dp[0]=1;
        for(int i=1;i<n;i++){
            for(int j=i-1;j>=0;j--){//从i-1开始
                if(nums[j]<nums[i]&&dp[j]>dp[i])
                    dp[i]=dp[j];
            }
            dp[i]++;
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

标答 树状数组

前置知识——树状数组是什么

                                                                                            ——来源:算法学习笔记(2) : 树状数组 

树状数组思路

dp的第二层循环的目的是找小于等于num[i]的数字中dp[j]>dp[i]的

所以建立树状数组c[i],其中i是num[i],c[i]是dp[i],从1开始

首先建树int c[maxn],c[1]=1,如果query(i-1)>dp[i],dp[i]=query(i-1);dp[i]++,add(i, dp[i])

或者不要dp数组了,因为dp[i]刚刚遍历到为0,一定query(i-1)>dp[i];之后的操作也没有dp[i-1],所以可以省略

写完了发现nums[i]居然有负数,记得加上偏移量

代码 Runtime 4 ms Beats 95.80% Memory 10.3 MB Beats 87.20%

class Solution {
public:
    #define lowbit(x) x&(-x)
    int c[20004]={0};
    //c[1]不需要初始化为1
    int query(int a){//找[1,a]中最大的数
        int maxx=0;
        for(int i=a;i>0;i-=lowbit(i))
            maxx=max(maxx,c[i]);
        return maxx;
    }
    void add(int a,int k){
        for(int i=a;i<20004;i+=lowbit(i))
            c[i]=max(c[i],k);
    }
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();int ans=0;
        for(int i=0;i<n;i++){
            int ma=query(nums[i]-1+10001);//注意这里是nums[i]-1,比nums[i]小才可以
            add(nums[i]+10001,ma+1);
            ans=max(ans,ma+1);
        }
        return ans;
        //因为你不知道数组nums中最大的数m是多少(除非你遍历一遍)
        //所以你不能return query(m)
        //所以一边遍历一边更新答案
    }
};

322. Coin Change

题意:给你硬币类型和目标,求最少的硬币数

我的思路

不知道贪心行不行,所以就用动态规划了

1. 初始化为负无穷来判断安排是否合法

2. 求最小的时候要多一步条件判断

代码 Runtime 59 ms Beats 87.21% Memory9.9 MB Beats 98.52%

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int dp[10004];
        memset(dp,-0x3f,sizeof(dp)); dp[0]=0;
        int m=coins.size();
        for(int i=0;i<=amount;i++){
            for(int j=0;j<m;j++){
                if(i>=coins[j]&&dp[i-coins[j]]>=0){
                    if(dp[i]<0)
                        dp[i]=dp[i-coins[j]]+1;
                    else    
                        dp[i]=min(dp[i],dp[i-coins[j]]+1);
                }
            }
        }
        if(dp[amount]<0)return -1;
        return dp[amount];
    }
};

标答 递归+贪心+记忆化 但是没懂

最前面的条件判断:如果amount是双数,但是coin里面没有双数就返回-1;硬币从小到大排序;

接下来看注解,总之是很精密的代码

就是有一个地方不懂,如果没有一开始的if判断,它会超时

那有无可能 存在一个不被最开始的if检测到的-1情况会使这个代码超时?

代码 Runtime3 ms Beats 99.98% Memory9.9 MB Beats 99.78%

class Solution{
bool check(vector<int>& coins, short index, int cnt, int target){
        long sum = (long) coins[index]*cnt;//相乘可能超出int的范围
        if (sum==target) return true;//如果数量刚好,就是可以用cnt个硬币
        else if (sum > target) {//如果sum超过了,就要换个计划
            if (index == 0) return false;//没有剩下的硬币类型了,不可能了
            for (short i = cnt; i>0; i--){//预计给之后的硬币类型 i个来搞定,自己留下cnt-i个
                long take = target - (long)coins[index]*(cnt-i);
                //take是预计之后的硬币类型要达成的数量
                //为什么cnt-i会==0,因为可能不用这个硬币
                if (take < 0) break;
    //为什么自己留下的cnt-i要从小到大遍历?因为cnt-i大了,take小于0,更大的cnt-i就更不用看了
                int r =  take;//隐性的类型转换也要时间,所以这里多一步
                if (check(coins, index-1, i, r)) return true;    
            }
        }
        return false;
    }
public:
    int coinChange(vector<int>& coins, int amt) {
        if (amt&1){//如果是双数
            short i=0;
            for (;i<coins.size();i++){
                if(coins[i]&1)break;
            }
            if (i==coins.size()) return -1;  
        }
        sort(coins.begin(), coins.end());
        int best = amt/coins.back();//个数最少的
        int worst = amt/coins.front();//个数最多的
        for(short i=best; i<=worst;i++)//预计i个硬币
            if (check(coins, coins.size()-1, i, amt)) 
                return i;
        return -1;
    }
};

347. Top K Frequent Elements

题意:返回k个出现次数最多的数

我的思路

哈希,nlogn

map默认是按key值从小到大排序的,不能更改sort方式,所以用vector<pii>的方式了

遇到的问题:错误解决方法:error: reference to non-static member function must be called

 要在cmp函数前面加上static

代码 Runtime 8 ms Beats 93.30% Memory13.7 MB Beats 59.82%

class Solution {
public:
    # define pii pair<int,int> 
     static bool cmp(pii &a,pii &b){
        return a.first>b.first;
    }
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int>mp;
        vector<pii> cnt; vector<int> ans;
        int n=nums.size();
        for(int i=0;i<n;i++)
            mp[nums[i]]++;
        for(auto&q:mp) 
            cnt.push_back({q.second,q.first});
        sort(cnt.begin(),cnt.end(),cmp);
        for(int i=0;i<k;i++)
            ans.push_back(cnt[i].second);
        return ans;
    }
};

标答是map+优先队列,我觉得差不多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lesson4-2:OpenCV图像特征提取与描述---Harris和Shi-Tomas算法

学习目标 理解Harris和Shi-Tomasi算法的原理能够利用Harris和Shi-Tomasi进行角点检测 1 Harris角点检测 1.1 原理 H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像&#xff0c;角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化&#xff…

【多线程】线程间通信及状态

文章目录 1. 线程间的通信1.1 wait和notify1.2 notify随机唤醒1.3 notifyAll()1.4 join() 2. 线程间的状态3. 验证线程的状态3.1 验证NEW、RUNNABLE、TERMINATED3.2 验证WAITING3.3 验证TIMED-WAITING3.4 验证BLOCKED 4. 面试题&#xff1a;wait和sleep对比 1. 线程间的通信 1…

人工智能轨道交通行业周刊-第58期(2023.8.28-9.3)

本期关键词&#xff1a;成都智慧工厂、机务段、站台地标、备案大模型、AIGC报告 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路…

Redis 缓存穿透击穿和雪崩

一、说明 Redis 缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要害的问题&#xff0c;就是数据的一致性问题&#xff0c;从严格意义上讲&#xff0c;这个问题无解。如果对…

C# Color颜色RGB对照表

序号Color色系颜色RGB图例1Color.AliceBlue蓝色艾丽丝蓝240,248,2552Color.AntiqueWhite白色古典白色250,235,2153Color.Aqua&#xff0c;Color.Cyan青色浅蓝色&#xff0c;蓝绿色&#xff0c;青色0,255,255 C# Color颜色RGB对照表_旭东怪的博客-CSDN博客 C#颜色和名称样式对照…

Nginx全家桶配置详解

源码包安装NGINX A&#xff0c;搭建Web Server&#xff0c;任意HTML页面&#xff0c;其8080端口提供Web访问服务&#xff0c;截图成功访问http(s)&#xff1a;//[Server1]:8080并且回显Web页面。保留Server1&#xff0c;但是不允许直接访问Server 1&#xff0c;再部署1套NGINX …

8.(Python数模)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…

1分钟实现 CLIP + Annoy + Gradio 文搜图+图搜图 系统

多模态图文搜索系统 CLIP 进行 Text 和 Image 的语义EmbeddingAnnoy 向量数据库实现树状结构索引来加速最近邻搜索Gradio 轻量级的机器学习 Web 前端搭建 文搜图 图搜图 CLIP图像语义提取功能&#xff01;

生信分析Python实战练习 3 | 视频21

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

已解决下载安装Python官网安装包下载速度慢问题

本文摘要&#xff1a;本文已解决下载安装Python官网安装包下载速度慢的问题。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究…

47、springboot 的 国际化消息支持--就是根据浏览器选择的语言,项目上的一些提示信息根据语言的选择进行对应的显示

springboot的国际化也是基于spring mvc 的。 springboot 的 国际化消息支持–就是根据浏览器选择的语言&#xff0c;项目上的一些提示信息根据语言的选择进行对应的显示。 总结下国家化自动配置&#xff1a; 功能实现就是&#xff1a; 比如一个登录页面&#xff0c;我们在浏览…

ORB-SLAM3复现的详细过程——配置安装及ROS和脚本运行---Ubuntu20.04

ORB-SLAM3配置安装及ROS和脚本运行---Ubuntu20.04 1. 安装所需要的依赖和包2. 修改代码及文件内容2.1 CMakeLists.txt文件的修改2.2 单目可视化代码修改2.3 环境配置文件的修改2.4 源码的修改 3.ORB-SLAM3的编译3.1 构建 ORB-SLAM3 库3.2 生成ROS节点 4.ORB-SLAM3的运行4.1 非R…

ModaHub魔搭社区专访百度智能云李莅:您认为向量数据库是一个刚需产品吗?

ModaHub魔搭社区&#xff1a;可以看到&#xff0c;大模型火了以后&#xff0c;向量数据库受到了特别高的关注&#xff0c;您是如何看待这种现象呢&#xff1f;您认为向量数据库是一个刚需产品吗&#xff1f; 李莅&#xff1a;是的。大模型是在今年才崭露头角&#xff0c;或者说…

【Python Odyssey】1-1 | Python初见面

文章目录 Python 由来Python 的历史Python 的优点Python的缺点Python 运用领域Python 环境配置Python 解释器安装确认Python的版本编写Python源代码运行程序 Python 由来 Python 是 吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;在阿姆斯特丹为了打发无聊的圣诞节&…

三维点云转换为二维图像

文章目录 前言原理代码总结与反思实验结果展示 前言 目的&#xff1a;将三维点云转换为二维图像 作用&#xff1a; a.给点云赋予彩色信息&#xff0c;增强点云所表达物体或对象的辨识度&#xff1b; b.将三维点云中绘制的目标物体通过映射关系绘制到二维图像中&#xff0c;这个…

Lesson5-1:OpenCV视频操作---视频读写

学习目标 掌握读取视频文件&#xff0c;显示视频&#xff0c;保存视频文件的方法 1 从文件中读取视频并播放 在OpenCV中我们要获取一个视频&#xff0c;需要创建一个VideoCapture对象&#xff0c;指定你要读取的视频文件&#xff1a; 创建读取视频的对象 cap cv.VideoCapt…

Nginx安装与部署

文章目录 一,说明二,下载三,Windows下安装1,安装2,启动3,验证 四,Linux下安装1,安装2,启动3,验证 五,Nginx配置 一,说明 Nginx是一款高性能Web和反向代理服务器,提供内存少,高并发,负载均衡和反向代理服务,支持windos和linux系统 二,下载 打开浏览器,输入地址: https://ngin…

【小沐学NLP】Python使用NLTK库的入门教程

文章目录 1、简介2、安装2.1 安装nltk库2.2 安装nltk语料库 3、测试3.1 分句分词3.2 停用词过滤3.3 词干提取3.4 词形/词干还原3.5 同义词与反义词3.6 语义相关性3.7 词性标注3.8 命名实体识别3.9 Text对象3.10 文本分类3.11 其他分类器3.12 数据清洗 结语 1、简介 NLTK - 自然…

递归算法学习——目标和,组合总和,字母大小写全排列

目录 一&#xff0c;目标和 1.题意 2.例子 3.题目接口 4.解题思路及代码 二&#xff0c;组合总和 1.题意 2.例子 3.题目接口 4.解题思路及代码 三&#xff0c;字母大小写全排列 1.题意 2.例子 3.题目接口 4.解题思路及代码 一&#xff0c;目标和 1.题意 给你一个…

jsp 新能源汽车论坛网Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 新能源汽车论坛网是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…