Leetcode
Leetcode
循环是人递归是神
北京邮电大学
展开
-
365. 水壶问题
记录一下,第一次遇到自定义unordered_set的hash函数 int x, y, z; struct node { int a, b; node(int x, int y) :a(x), b(y) {}; bool operator == (const node &nd) const { return nd.a == a && nd.b == b; } };.原创 2020-06-13 00:59:41 · 181 阅读 · 0 评论 -
287. 寻找重复数
反二分法,用二分法减小范围。int findDuplicate(vector<int>& nums) { int l = 1,r = nums.size() - 1; while(l < r){ int m = (l+r)/2; int cnt = 0; for(int i:nums) if(i <= m) .原创 2020-05-26 14:27:07 · 128 阅读 · 0 评论 -
76. 最小覆盖子串
太菜不会,看的别人的题解https://leetcode-cn.com/problems/minimum-window-substring/solution/c-zuo-you-zhi-zhen-fa-xiang-jie-by-yizhe-shi/ string minWindow(string s, string t) { int minlen = 0x3f3f3f3f,curlen = 0,start = 0; string ans = ""; ..原创 2020-05-23 21:58:39 · 420 阅读 · 1 评论 -
152. 乘积最大子数组
求连续数的最大乘积uva上有也这道题,不过数据量没有lc上的大,当时n^2过的...... int maxProduct(vector<int>& nums) { int maxi = nums[0],mini = nums[0],maxn = nums[0]; for(int i = 1;i < nums.size();i++){ int curmin = mini*nums[i]; int原创 2020-05-18 14:52:16 · 128 阅读 · 0 评论 -
210. 课程表 II
DAG问题 vector<int> g[5000]; int vis[5000],ok = 0; vector<int> r; void dfs(int cur) { vis[cur] = 1; if(ok) return; for(int i:g[cur]) { if(vis[i] == 1) {.原创 2020-05-18 00:18:31 · 111 阅读 · 0 评论 -
322. 零钱兑换
动态规划问题,也可以用记忆dfs做//动态规划int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1,0x3f3f3f3f); dp[0] = 0; for(int i = 1;i <= amount;i++) { for(int j:coins) { .原创 2020-05-16 17:00:10 · 128 阅读 · 0 评论 -
25. K 个一组翻转链表
不想模拟,看了下别人的思路,递归的神ListNode* reverse(ListNode* a, ListNode* b) { ListNode* pre = new ListNode(NULL); ListNode* cur = a; ListNode* temp; while (cur != b) { temp = cur->next; cur->n.原创 2020-05-16 14:29:34 · 118 阅读 · 0 评论 -
560. 和为K的子数组
今天这道题有点意思,用前缀和n^2复杂度过不了 int subarraySum(vector<int>& nums, int k) { int pre[20005]; pre[0] = 0; for(int i = 1;i <= nums.size();i++) { pre[i] = pre[i-1]+nums[i-1]; } int ans = 0;原创 2020-05-15 14:55:05 · 109 阅读 · 0 评论 -
面试题 08.12. 八皇后
水过~ int vis[3][100000],c[100000]; vector<string> s; vector<vector<string>> ans; void dfs(int cur,int n) { if(cur == n) { vector<string> temp = s; for(int i = 0;i < n;i+.原创 2020-05-13 15:08:13 · 135 阅读 · 0 评论 -
155. 最小栈
最近的每日一题都是啥玩意儿啊 MinStack() { } void push(int x) { if(x<min) min = x; s.push(make_pair(x,min)); } void pop() { s.pop(); if(s.empty()) min = 0x7fffffff; .原创 2020-05-12 14:44:45 · 111 阅读 · 0 评论 -
50. Pow(x, n)
快速幂 double myPow(double x, int n) { if(x==1) return 1; double a = x,ans = 1; long b = abs(n); while(b) { if(b&1) ans *= a; b = b>>1; .原创 2020-05-11 13:13:05 · 123 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
unordered_map<int,int> buf; //记录结点u的父节点 void dfs1(TreeNode* root,int u) { if(root!=NULL) { buf[root->val] = u; dfs1(root->left,root->val); dfs1(root->right,root->...原创 2020-05-10 15:01:10 · 113 阅读 · 0 评论 -
14. 最长公共前缀
100题打下卡 string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0) return ""; string s = strs[0]; for(int i = 1;i < strs.size();i++)...原创 2020-05-08 07:12:54 · 105 阅读 · 0 评论 -
572. 另一个树的子树
bool isSubtree(TreeNode* s, TreeNode* t) { return dfs1(s,t); } int dfs1(TreeNode* s, TreeNode* t) { if(s==NULL) return 0; if(s->val == t->val...原创 2020-05-08 23:38:49 · 69 阅读 · 0 评论 -
从中序与后序遍历序列构造二叉树 && 从前序与中序遍历序列构造二叉树
//中序和后序构造二叉树 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { if(inorder.size()==0) return NULL; reverse(postorder.begin(),posto...原创 2020-05-08 23:39:41 · 144 阅读 · 0 评论 -
二叉树的前中后层序遍历
vector<int> r; vector<int> postorderTraversal(TreeNode* root) { dfs(root); return r; } void dfs(TreeNode* root) { if(root!=NULL) {...原创 2020-05-08 23:40:04 · 184 阅读 · 0 评论 -
983. 最低票价
动态规划 int mincostTickets(vector<int>& days, vector<int>& costs) { int dp[368]; memset(dp,0x3f,sizeof(dp)); dp[0] = 0; int days_idx = ...原创 2020-05-08 23:41:18 · 90 阅读 · 0 评论 -
1434. 每个人戴不同帽子的方案数
int numberWays(vector<vector<int>>& hats) { int n = hats.size(); const int MOD = 1e9 + 7; vector<int> dp(1 << n); dp[0] = 1; vector<vector<int>> s(4...原创 2020-05-09 09:29:00 · 211 阅读 · 1 评论 -
3. 无重复字符的最长子串
int lengthOfLongestSubstring(string s) { int len = s.size(); if(len == 0) return 0; vector<int> dp(len, 0); dp[0] = 1; int maxlen = 1; ...原创 2020-05-09 09:41:23 · 193 阅读 · 0 评论 -
5180. 带限制的子序列和
状态方程dp[i]定义为:包含i的前i个数构成最大和 (当然是满足下标条件的最大和~)dp[i] = max(dp[i],dp[i-j]+nums[i]); j取值0~k在这里,每次回去寻找前面k个数中,哪个数构成和最大。循环过程中,前一次循环和本次的前k个数有k-1个数是相同的,利用这一特点可以进行优化。``` //dp[i]定义为:包含i的前i个数构成最大和(当然是满足下标...原创 2020-05-09 21:49:03 · 159 阅读 · 0 评论 -
leetcode 185场周赛
1418.点菜展示表 static int cmp(string a, string b){ return atoi(a.c_str()) < atoi(b.c_str());} vector<vector<string>> displayTable(vector<vector<string>>& orders)...原创 2020-05-09 21:49:46 · 96 阅读 · 0 评论 -
72. 编辑距离
int minDistance(string s1, string s2) { int m = s1.size(), n = s2.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); for (int i = 1; i <= m...原创 2020-05-09 22:03:46 · 80 阅读 · 0 评论 -
1143. 最长公共子序列
int longestCommonSubsequence(string s1, string s2) { int m = s1.size(),n = s2.size(); vector<vector<int>> dp(m+1,vector<int> (n+1,0)); for(int i = 0;i &l...原创 2020-05-09 22:05:25 · 116 阅读 · 0 评论 -
牛客 最长上升子序列
int lengthOfLIS(vector<int>& nums) { if (nums.size() == 0) return 0; int len = 1; vector<int> dp(nums.size(), 1); for (int i = 1; i < nums.size(); i++) { for (int j = 0; ...原创 2020-10-09 13:08:01 · 312 阅读 · 0 评论 -
leetcode 74 搜索二维矩阵
经典二分 bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.size() ==0 || matrix[0].size()==0) return false; int m = matrix.size(),n ...原创 2020-04-04 10:20:04 · 92 阅读 · 0 评论 -
leetcode45 跳跃游戏2
贪心算法题目,尝试dfs只能过70%左右。注意题上的假设:假设你总是可以到达数组的最后一个位置。dfsvoid dfs(int cur, int step, vector<int> nums){ if (step >= k) return; if (cur >= nums.size() - 1) { if (step < k) ...原创 2020-03-30 12:15:48 · 158 阅读 · 0 评论 -
leetcode 42:接雨水
总的思路就是用装满的水柱减去现在水柱的面积,就等于还可以填充的多少。即代码中sum2 - sum1 if (height.size() <= 2) return 0; int sum1 = 0, sum2 = 0; for (int i = 0; i < height.size(); i++) sum1 += height[i]; for (int i...原创 2020-03-30 01:44:34 · 173 阅读 · 0 评论 -
leetcode 206 反转链表
原地算法public static ListNode reverseListIterative(ListNode head) { ListNode prev = null; //前指针节点 ListNode curr = head; //当前指针节点 //每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移 whi...原创 2020-03-02 11:04:15 · 110 阅读 · 0 评论 -
leetcode 162 寻找峰值
这道题主要是题意的理解,题中“你可以假设nums[-1] = nums[n] = -∞。”这句话暗示如果num[i] <num[i+1],那么峰值一定在i+1到数组末尾存在。int findPeakElement(vector<int>& nums) { int l = 0,r = nums.size() - 1; while(l ...原创 2020-02-29 13:23:26 · 126 阅读 · 0 评论 -
leetcode 81 搜索旋转排序数组 2(对比33 搜索排序旋转数组)
与33 搜索排序旋转数组的区别就是加上了重复元素的跳过 bool search(vector<int>& nums, int target) { if (nums.size() == 0) return false; int l = 0, r = nums.size() - 1; while (l < r) ...原创 2020-02-21 07:50:15 · 99 阅读 · 0 评论 -
leetcode 55 跳跃游戏
bool canJump(vector<int>& nums) { int len = nums.size(); if (len <= 1) return true; int maxDis = nums[0]; for (int i = 1; i < len - 1; i++) { if (i <= maxDis) { maxDis =...原创 2020-02-20 03:05:39 · 86 阅读 · 0 评论 -
leetcode 80 删除排序数组中的重复项 II
int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; int length = 1,cnt = 0; for(int i = 1;i < nums.size();i++){ if(...原创 2020-02-20 02:21:45 · 124 阅读 · 0 评论 -
leetcode 75 颜色分类
void sortColors(vector<int>& nums) { int p0 = 0,cur = 0,p1 = nums.size() - 1,temp; while(cur <= p1) { if(nums[cur] == 2) { ...原创 2020-02-19 09:25:02 · 131 阅读 · 0 评论 -
leetcode 73 矩阵置零
void setZeroes(vector<vector<int>>& matrix) { bool isCol = false; int R = matrix.size(); int C = matrix[0].size(); for (int i = 0; i < R; i++) ...原创 2020-02-19 01:43:25 · 130 阅读 · 0 评论 -
leetcode 64 最小路径和
dfs最后两组数组超时过不了,只能用动态规划dp:class Solution {public: int minPathSum(vector<vector<int>>& grid) { int r = grid.size(),c = grid[0].size(); vector<vector<int&g...原创 2020-02-15 09:36:20 · 113 阅读 · 0 评论 -
leetcode 23 不同路径2
dfs + 打表过不了,只能动态规划int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { if (!obstacleGrid.size() || !obstacleGrid[0].size()) return 0; int ...原创 2020-02-14 12:15:49 · 70 阅读 · 0 评论 -
leetcode 62 不同路径
class Solution {public: int vis[101][101]; int uniquePaths(int m, int n) { if (m == 1 && n == 1) return 1; if (m == 0 || n == 0) return 0; if (vis...原创 2020-02-13 20:38:57 · 94 阅读 · 0 评论 -
leetcode 66 加1
vector<int> plusOne(vector<int>& digits) { vector<int> r; queue<int> q; int ok = 1; for (int i = 0; i < digits.size(); i++) { ...原创 2020-02-12 11:41:19 · 95 阅读 · 0 评论 -
leetcode 41 缺失的第一个正数
思路很简单,找出最大正数和最小正数,然后建立一个数组visit,记录从最小正数到最大正数之间哪些数有,哪些数没有。最后遍历一下visit就行了。不过visit的长度需要注意一下。举个简单的例子,nums = [1,4,5,1000]。很显然,缺失的最小整数为3。在new一个数组visit记录1到1000哪些数存在与否有点技巧。你可以直接new长度1000的数组,但如果最大元素太大,内存开销会不足。...原创 2020-02-12 06:08:12 · 87 阅读 · 0 评论 -
leetcode 40 组合总和 2
vector<int> candidates1, r1;vector<vector<int>> r2;void dfs(int cur, int sum, int start, int target) { if (sum > target) return; if (sum == target) { r2.push_back(r1); ...原创 2020-02-10 19:44:36 · 105 阅读 · 0 评论