leetcode刷题笔记
EGNIR
这个作者很懒,什么都没留下…
展开
-
leetcode刷题笔记 1221.分割平衡字符串【简单】
栈int balancedStringSplit(string s) { stack<int> st; int num = 0; int count = 0; for (char i : s) { if (st.empty()) { st.push(i); count++; num++; } else { char t原创 2021-09-07 21:50:56 · 54 阅读 · 0 评论 -
leetcode刷题笔记 295.数据流的中位数【困难】
1、二分按顺序插入class MedianFinder {private: vector<int> v; double mid = 0;; int size = 0;public: MedianFinder() { } void addNum(int num) { v.insert(lower_bound(v.begin(), v.end(), num), num); size++; if原创 2021-08-27 09:32:47 · 125 阅读 · 0 评论 -
leetcode刷题笔记 881.救生艇【中等】
int numRescueBoats(vector<int>& people, int limit) { int res = 0; sort(people.begin(), people.end()); int n = people.size(); int left = 0, right = n - 1; while (left <= right) { if (people[right] + people[left] <= limit) { res++;原创 2021-08-26 22:08:27 · 78 阅读 · 0 评论 -
leetcode刷题笔记 621.任务调度器【中等】
int leastInterval(vector<char>& tasks, int n) { int len = tasks.size(); int max = 0; int count = 0; map<char,int> m; for (auto i : tasks) { m[i]++; if (m[i] > max) { max = m[i]; count = 0; } else if (m[i] == max) {原创 2021-08-25 19:44:42 · 68 阅读 · 0 评论 -
leetcode刷题笔记 169.多数元素【简单】
1、哈希表int majorityElement(vector<int>& nums) { int n = nums.size(); map<int, int> m; for (int i = 0; i < n; i++) { if (m.find(nums[i]) == m.end()) m[nums[i]] = 1; else { m[nums[i]]++; } if (m[nums[i]] > n / 2) retu原创 2021-08-25 13:25:16 · 70 阅读 · 0 评论 -
leetcode刷题笔记 150.逆波兰表达式求值【中等】
int evalRPN(vector<string>& tokens) { int n = tokens.size(); stack<string> st; set<string> s = { "+","-","*","/" }; int count = 0; for (int i = 0; i < n; i++) { if (s.find(tokens[i]) == s.end()) { st.push(tokens[i]); }原创 2021-08-25 13:01:07 · 92 阅读 · 0 评论 -
leetcode刷题笔记 371.两整数之和【中等】
int getSum(int a, int b) { while (a != 0) { int a2 = (unsigned int)(a & b) << 1; int b2 = a ^ b; a = a2; b = b2; } return b;}原创 2021-08-25 12:40:00 · 82 阅读 · 0 评论 -
leetcode刷题笔记 166.分数到小数【中等】
string fractionToDecimal(int numerator, int denominator) { if (numerator == 0) return "0"; string res; long long num = (long long)numerator; long long denom = (long long)denominator; if ((num > 0) ^ denom > 0) res.push_back('-'); num = abs(原创 2021-08-25 12:18:28 · 72 阅读 · 0 评论 -
leetcode刷题笔记 29.两数相除【中等】
int helper(long long a, long long b){ if (a < b) return 0; long long count = 1, tb = b; while (a >= tb * 2) { count = count * 2; tb = tb * 2; } return count + helper(a - tb, b);}int divide(int dividend, int divisor) { if (dividend ==原创 2021-08-25 11:37:38 · 62 阅读 · 0 评论 -
leetcode刷题笔记 50.Pow(x,n)【中等】
1、快速幂(递归)double helper(double x, long long n) { if (n == 0) return 1.0; double y = helper(x, n / 2); if (n % 2 == 0) return y * y; else return y * y * x;}double myPow(double x, int n) { if (n >= 0) return helper(x, n); else return 1/原创 2021-08-24 20:49:17 · 76 阅读 · 0 评论 -
leetcode刷题笔记 171.Excel表列序号【简单】
1、进制转换int titleToNumber(string columnTitle) { int res = 0; int len = columnTitle.size(); for (int i = 0; i < len; i++) { res = res * 26 + (columnTitle[i] - 'A') + 1; } return res;}原创 2021-08-24 20:16:54 · 46 阅读 · 0 评论 -
leetcode刷题笔记 172.阶乘后的零【简单】
1、根据5的数目int trailingZeroes(int n) { //5的倍数的数量 25算2个 125算3个 int count = 0; for (int i = 1; i <= n; i++) { int k = i; while (k % 5 == 0) { count++; k /= 5; } } return count;}时间:O(n)2、除5的次方之和int trailingZeroes(int n) { int res = 0;原创 2021-08-24 20:04:05 · 80 阅读 · 0 评论 -
leetcode刷题笔记 202.快乐数【简单】
1、哈希表存储bool isHappy(int n) { int m = n; set<int> s; while (m != 1) { s.insert(m); int k = 0; while (m != 0) { k = k + pow(m % 10, 2); m /= 10; } m = k; if (s.find(m)原创 2021-08-23 19:34:02 · 64 阅读 · 0 评论 -
leetcode刷题笔记 300.最长递增子序列【中等】
1、动态规划int lengthOfLIS(vector<int>& nums) { int n = nums.size(); vector<int> flags(n); flags[0] = 1; int res = 1; for (int i = 1; i < n; i++) { int m = 0; for (int j = 0; j < i; j++) { if (nums[j] < nums[i]) { m = m原创 2021-08-23 19:15:46 · 107 阅读 · 0 评论 -
leetcode刷题笔记 322.零钱兑换【中等】
1、广度优先搜索int coinChange(vector<int>& coins, int amount) { if (amount == 0) return 0; int n = coins.size(); vector<int> flags(amount); queue<int> q; q.push(amount); int count = 0; while (!q.empty()) { count++; int s = q.si原创 2021-08-23 15:35:11 · 75 阅读 · 0 评论 -
leetcode刷题笔记 62.不同路径【中等】
动态规划int uniquePaths(int m, int n) { vector<int> v(n); int j; for (int i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (j == 0) v[j] = 1; else v[j] = v[j] + v[j - 1]; } } return v[j-1];}用组合数也可以,但若数据范围则连乘可能溢出。...原创 2021-08-23 14:23:26 · 79 阅读 · 0 评论 -
leetcode刷题笔记 55.跳跃游戏【中等】
1、从后向前 判断每个位置是否可到达终点bool canJump(vector<int>& nums) { int n = nums.size(); vector<bool> flags(n); flags[n - 1] = 1; for (int i = n - 2; i >= 0; i--) { for (int j = nums[i]; j >=1; j--) { if (i + j >= n - 1 || flags[i + j]原创 2021-08-23 14:13:53 · 92 阅读 · 0 评论 -
leetcode刷题笔记 240.搜索二维矩阵 II【中等】
1、从左上角开始 递归bool searchMatrix(vector<vector<int>>& matrix, int target,int u,int d,int l,int r) { if (u > d || l > r) return false; else if (u == d && l == r && matrix[u][l] == target) return true; int i=u, j=l;原创 2021-08-22 20:20:25 · 115 阅读 · 0 评论 -
leetcode刷题笔记 56.合并区间【中等】
static bool cmp(vector<int> a, vector<int> b) { return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), cmp); int n = intervals.size(); if (n原创 2021-08-22 09:21:23 · 64 阅读 · 0 评论 -
leetcode刷题笔记 215.数组中的第K个最大元素【中等】
int findKthLargest(vector<int>& nums, int k) { int n = nums.size(); priority_queue<int,vector<int>,greater<int>> q; for (int i = 0; i < k; i++) { q.push(nums[i]); } for (int i = k; i < n; i++) { int temp = q.top()原创 2021-08-21 18:11:00 · 54 阅读 · 0 评论 -
leetcode刷题笔记 347.前K个高频元素【中等】
1、存在哈希表后,放入vector,对vector用sortstatic bool cmp(pair<int, int> a, pair<int, int> b) { return a.second > b.second;}vector<int> topKFrequent(vector<int>& nums, int k) { int n = nums.size(); unordered_map<int, int> m;原创 2021-08-21 17:39:49 · 65 阅读 · 0 评论 -
leetcode刷题笔记 75.颜色分类【中等】
1、先排2,再排1(两趟扫描)void sortColors(vector<int>& nums) { int n = nums.size(); int q = n - 1; int i = 0; while (i <= q) {//先排2 if (nums[i] == 2) { swap(nums[i], nums[q]); q--; } else { i++; } } i = 0; while (i <= q) {//再排原创 2021-08-20 11:37:42 · 84 阅读 · 0 评论 -
leetcode刷题笔记 79.单词搜索【中等】
深度优先搜索 剪枝bool dfs(int i, int j, int len, vector<vector<char>>& board, string& word, vector<vector<bool>>& path) { int size = word.size(); int m = board.size(); int n = board[0].size(); bool res = false; if (len !=原创 2021-08-20 11:06:23 · 66 阅读 · 0 评论 -
leetcode刷题笔记 78.子集【中等】
动态规划vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> ans; ans.push_back({}); int len = nums.size(); for (int i = 0; i < len; i++) { int size = ans.size(); for (int j = 0; j < size; j++) {原创 2021-08-13 20:12:41 · 75 阅读 · 0 评论 -
leetcode刷题笔记 46.全排列【中等】
回溯void helper(vector<vector<int>>& ans, vector<int>& nums, vector<int>& flags, vector<int>& one,int index) { int len=nums.size(); if (index == len) { ans.push_back(one); } else { for (int i = 0; i <原创 2021-08-13 17:55:04 · 98 阅读 · 0 评论 -
leetcode刷题笔记 22.括号生成【中等】
回溯void gen(vector<string>& ans,int nums,string& str,int& n) { if (str.size() == 2*n) { ans.push_back(str); } else { if (nums < n) { str.push_back('('); gen(ans, nums + 1, str, n); str.pop_back(); } if (2 * nums >原创 2021-08-13 17:20:47 · 107 阅读 · 0 评论 -
leetcode刷题笔记 17.电话号码的字母组合【中等】
回溯void backtrack(vector<string>& ans, map<char, string>& m,string& digits, int index, string& str) { if (index == digits.length()) { ans.push_back(str);//一个结束 } else { char digit = digits[index];//位数 string letters = m原创 2021-08-13 17:16:04 · 139 阅读 · 0 评论 -
leetcode刷题笔记 200.岛屿数量【中等】
广度优先搜索int numIslands(vector<vector<char>>& grid) { int count = 0; int dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} }; int m = grid.size(); int n = grid[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g原创 2021-08-13 12:40:43 · 91 阅读 · 0 评论 -
leetcode刷题笔记 230.二叉搜索树中第K小的元素【中等】
中序遍历int kthSmallest(TreeNode* root, int k) { stack<TreeNode*> st; TreeNode* cur = root; st.push(cur); cur = cur->left; while (!st.empty()||cur) { while (cur) { st.push(cur); cur = cur->left;原创 2021-08-12 22:20:39 · 58 阅读 · 0 评论 -
leetcode刷题笔记 117.填充每个节点的下一个右侧节点指针【中等】
1、广度优先搜索Node* connect(Node* root) { if (root == NULL) return NULL; queue<Node*> q; Node* cur = root; q.push(cur); while (!q.empty()) { int len = q.size(); for (int i = 0; i < len; i++) { cur原创 2021-08-12 22:05:39 · 61 阅读 · 0 评论 -
leetcode刷题笔记105.从前序和中序遍历序列构造二叉树【中等】
TreeNode* helper(vector<int> & preorder, vector<int> & inorder, int p1, int p2, int in1, int in2) { if (p2 - p1 == 0) return NULL; int p = preorder[p1]; if (p2 - p1 == 1) { TreeNode* cur = new TreeNode(p); return cur; .原创 2021-08-10 14:58:40 · 67 阅读 · 0 评论 -
leetcode刷题笔记 103.二叉树的锯齿形层序遍历【中等】
用两个栈vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> ans; int level = 1; stack<TreeNode*> st1, st2; TreeNode* cur; if (root == NULL) return ans; st1.push(root); ans.push_back(vector<int&g原创 2021-08-10 13:24:06 · 63 阅读 · 0 评论 -
leetcode刷题笔记 94.二叉树的中序遍历【简单】
1、利用栈vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode*> st; TreeNode* cur = root; while (!st.empty() || cur) { while (cur) { st.push(cur); cur = cur->left; } cur = st.top(); st.pop();原创 2021-08-08 15:13:40 · 93 阅读 · 0 评论 -
leetcode刷题笔记 160.相交链表【简单】
1、哈希表ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) { if (headA == NULL || headB == NULL) return NULL; map<ListNode*, int> m; ListNode* cur = headA; while (cur) { m[cur] = cur->val; cur = cur->next; } cur = headB;原创 2021-08-08 14:59:22 · 94 阅读 · 0 评论 -
leetcode刷题笔记 328.奇偶链表【中等】
1、先确定节点个数,再按照要求调整节点顺序ListNode* oddEvenList(ListNode* head) { ListNode* last = head; ListNode* cur = head; int nums = 1; ListNode* odds = head; int total = 0; while (cur) { total++; cur = cur->next; } cur = head; while (total) { if (nums原创 2021-08-07 18:30:32 · 62 阅读 · 0 评论 -
leetcode刷题笔记2.两数相加【中等】
模拟ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* ans = new ListNode; ListNode* cur = ans; int jinwei = 0; while (1) { int n1 = 0, n2 = 0; if (l1) { n1 = l1->val; l1 = l1->next; } if (l2) { n2 = l2->val; l2原创 2021-08-06 23:27:42 · 80 阅读 · 0 评论 -
leetcode刷题笔记 334.递增的三元子序列【中等】
1、贪心 三个变量bool increasingTriplet(vector<int>& nums) { int n = nums.size(); int first = 0, second = 0, third = 0; int i = 1; for (; i < n - 1; i++) { if (nums[i - 1] < nums[i]) { first = i - 1; second = i; third = first; br原创 2021-08-06 13:31:43 · 93 阅读 · 0 评论 -
leetcode刷题笔记 5.最长回文子串【中等】
动态规划记录最长回文子串和最靠右侧的最长回文子串string longestPalindrome(string s) { int n = s.size(); int left = 0; string max = ""; max.push_back(s[0]); for (int i = 0; i < n; i++) { if (left - 1 >= 0 && s[left - 1] == s[i]) {//左右同时延伸 left = left - 1;原创 2021-08-06 11:16:20 · 66 阅读 · 0 评论 -
leetcode刷题笔记 3.无重复字符的最长子串【中等】
1、滑动窗口int lengthOfLongestSubstring(string s) { int n = s.size(); vector<char> window; unordered_set<char> m; int max = 0; for (int i = 0; i < n; i++) { if (m.find(s[i]) == m.end()) { m.insert(s[i]); window.push_back(s[i]); i原创 2021-08-05 22:51:08 · 101 阅读 · 0 评论 -
leetcode刷题笔记 49.字母异位词分组【中等】
1、排序 哈希表vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> ans; map<string,vector<string>> m; int n = strs.size(); for (int i = 0; i < n; i++) { string temp = strs[i];原创 2021-08-05 18:30:17 · 74 阅读 · 0 评论