数据结构与算法
一些题解
qq_43575217
这个作者很懒,什么都没留下…
展开
-
Java实现归并排序
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Test { public static void merge(int l,int r,List<Integer> list){ if(l>=r)return ; int mid=(l+r)/2; merge(l,mid,list); mer原创 2021-06-15 17:17:26 · 51 阅读 · 0 评论 -
Leetcode 212. 单词搜索 II
字典树+回溯 使用unordered_map去重 class Solution { public: int tree[10000][30],ed[10000],tot,vis[15][15],n,m; vector<string>res; unordered_map<int,string>mp; unordered_map<int,int>mp2; void insert(string s){ int root=0;原创 2021-05-07 18:54:23 · 50 阅读 · 0 评论 -
leetcode 403. 青蛙过河
题意很简单,就是每一次移动的步数与前一次移动的步数的绝对值差值不能超过一。很容易能想到dfs,但是单纯的dfs会tle。 可以想一想如果已经知道可以从x到y,下一次再到达x还需要再考虑y吗?所以可以采用记忆化来进行剪枝,我这里用set pre【i】来存储i点的前置节点。考虑到0 <= stones[i] <= 231 - 1 所以需要进行离散化,我这里使用了map。 class Solution { public: unordered_map<int,int>mp; set<i原创 2021-04-29 18:07:40 · 65 阅读 · 0 评论 -
c++实现快速排序
void quicksort(vector<int >& v,int l,int r){ //cout<<l << " "<<r<<endl; if(l>r) return; if(r-l<=1){ if(v[r]<v[l]) { int temp=v[r]; v[r]=v[l];原创 2021-04-28 22:07:02 · 50 阅读 · 0 评论 -
leetcode 209. 长度最小的子数组
解法一: 题目要求的是连续的子数组,我们可以维护一个满足条件的最小子数组。枚举数组的右边界,要缩小的话就是左边界右移,那么就可以用队列来维护这么一个数组,每次更新最小值。(其实不需要什么数据结构仅仅使用双指针就够了) 时间复杂度O(n) 解法二: 同样是枚举右边界,然后二分前缀数组寻找左边界。 时间复杂度O(n log(n)) class Solution { public: int minSubArrayLen(int target, vector<int>& nums) {原创 2021-04-28 20:37:29 · 37 阅读 · 0 评论 -
leetcode 1649 线段树模板题
class Solution { public: struct tree{ int l,r,sum; }tree[400010]; void build(int i,int l,int r){ tree[i].l=l;tree[i].r=r; if(l==r) return; int mid=(l+r)>>1; build(i*2,l,mid); build(i*2+1,mid+1,r); } int search(int i,in原创 2021-04-16 21:40:05 · 98 阅读 · 0 评论 -
leetcode 1681
可以用0表示不取数字,1表示取数字,那么一共有1<<nums种情况。用i的二进制表示其选取的数字,可以定义转态dp[i][j]:i这个数字其选取的数字在分成j组的情况下的最小不兼容性。可得转态转移方程:dp[i][j]=min(dp[i][j],dp[s][1]+dp[i-s][j-1]),其中s为i的子集并且s的二进制表示一定要有且仅有k个1。 int solve(vector<int>& v){//计算对应的十进制数字 int res=0; for(int原创 2021-04-16 21:38:05 · 85 阅读 · 0 评论