LeetCode
nirvana · rebirth
NIRVANA & REBIRTH
展开
-
Leetcode719.找出第k小的距离对【二分 & 双指针】
AC-Codeclass Solution {public: int smallestDistancePair(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); auto check = [&](int mid) -> bool { // 是否有至少k组,差值<=mid int cnt = 0, j = 1; ..原创 2021-09-17 19:57:11 · 192 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
AC-Codeclass Solution {private: bool nextPermutation(string& s) { // 首先从后向前查找第一个顺序对 (i,i+1),满足 a[i] < a[i+1]。这样「较小数」即为 a[i]。此时 [i+1,n) 必然是下降序列。 int i = s.size() - 2; while (i >= 0 && s[i] >= s[i + 1]) { .原创 2021-09-07 15:17:57 · 249 阅读 · 0 评论 -
LeetCode——10.正则表达式匹配(困难)【DP】
题解定义dp[i][j]:s[0,i−1]和p[0,j−1]是否匹配dp[i][j]:s[0,i-1]和p[0,j-1]是否匹配dp[i][j]:s[0,i−1]和p[0,j−1]是否匹配初值dp[0][0]=truedp[0][0]=truedp[0][0]=true只需要注意∗*∗的判断不匹配的时候dp[i][j]=dp[i][j−2]dp[i][j]=dp[i][j-2]dp[i][j]=dp[i][j−2],把∗*∗和∗*∗之前的字符拿掉,看是否匹配匹配的时候,由于可能匹配很多个,然..原创 2021-05-22 13:11:02 · 264 阅读 · 1 评论 -
LeetCode——25.K 个一组翻转链表(困难)
题解搞个头节点,直接每k个翻转即可AC-Code/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, List..原创 2021-05-22 12:53:00 · 155 阅读 · 0 评论 -
LeetCode——189.旋转数组
题解AC-Codeclass Solution {public: void rotate(vector<int>& nums, int k) { k = k % nums.size(); // 数据预处理优化 int count = 0; // n个人需要轮换n次 int next, prenum, tmp; for(int start = 0; count < nums.size(); ..原创 2020-09-22 20:24:02 · 213 阅读 · 0 评论 -
LeetCode——88.合并两个有序数组
题解双(尾)指针AC-Codeclass Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int tail = n + m - 1; int tail1 = m - 1; int tail2 = n - 1; while(tail2 >= 0) { ..原创 2020-09-19 22:28:28 · 181 阅读 · 0 评论 -
LeetCode——240.搜索二维矩阵
题解从左下(右上同理可行)开始搜索,如果大于目标,则说明当前行往下都是大于目标的,那么row-1。如果当前小于目标,则说明当前列往左都是小于目标的。这样类似于曼哈顿距离的逼近,直到找到目标或者出界。时间复杂度:O(n+m)O(n+m)O(n+m)。时间复杂度分析的关键是注意到在每次迭代(我们不返回 true)时,行或列都会精确地递减/递增一次。由于行只能减少 mmm 次,而列只能增加 nnn 次,因此在导致 while 循环终止之前,循环不能运行超过 n+mn+mn+m 次。因为所有..原创 2020-09-19 21:51:10 · 398 阅读 · 0 评论 -
LeetCode——169.多数元素【Boyer-Moore 投票算法】
题解投票算法证明:如果候选人不是maj 则 maj,会和其他非候选人一起反对 会反对候选人,所以候选人一定会下台(maj==0时发生换届选举)如果候选人是maj , 则maj 会支持自己,其他候选人会反对,同样因为maj 票数超过一半,所以maj 一定会成功当选AC-Codeclass Solution {public: int majorityElement(vector<int>& nums) { int candidate ..原创 2020-09-19 21:24:52 · 183 阅读 · 0 评论 -
LeetCode——405.数字转换为十六进制数
题解表面是10进制转换为16进制,实际上可以直接使用计算机存储的2进制形式转换为16进制2进制 → 16进制,就是4位合并。对于负数,仍然是4位合并。但是负数补码存储。进行算数右移操作时,左补1,所以对于负数,算数右移操作永远都不会是0,需要控制位数。32位2进制变成16进制,是8位.AC-Codeclass Solution {public: string toHex(int num) { if (num == 0) return "0"; ..原创 2020-09-19 17:42:15 · 1334 阅读 · 0 评论 -
LeetCode——404.左叶子之和
题解判断:①当前节点的左节点;②做儿子是叶子。AC-Code/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {publ...原创 2020-09-19 17:19:10 · 203 阅读 · 0 评论 -
LeetCode——236.二叉树的最近公共祖先
AC-Code/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* lowestCom...原创 2020-05-10 12:41:13 · 164 阅读 · 0 评论 -
LeetCode——365.水壶问题【贝祖定理】
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。你允许: 装满任意一个水壶 清空任意一个水壶 从一个水壶向另外一个水壶倒水,直到装满或者倒空示例 1: (From the famous "Die Hard" exa...原创 2020-04-27 17:44:54 · 308 阅读 · 0 评论 -
LeetCode——33.搜索旋转排序数组
题解注意下标选取不要使用 mid−1或mid+1mid - 1 或 mid + 1mid−1或mid+1,避免越界AC-Codeclass Solution {public: int search(vector<int>& nums, int target) { int n = nums.size(); if(n ==...原创 2020-04-27 17:28:54 · 177 阅读 · 0 评论 -
LeetCode——23.合并K个排序链表
题解每次选取各个列表头中最小的元素加入到结果集中,时间复杂度:O(KN)O(KN)O(KN)选最小头的过程可以用优先队列优化,时间复杂度:O(NlogK)O(NlogK)O(NlogK)AC-Codeclass Solution {public: struct Status { int val; ListNode *ptr; ...原创 2020-04-26 17:34:30 · 192 阅读 · 0 评论 -
LeetCode——12.整数转罗马数字
AC-Codeclass Solution {public: string intToRoman(int num) { // 把阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放在两个数组中 // 并且按照阿拉伯数字的大小降序排列,这是贪心选择思想 int nums[12] = {1000, 900, 500, 400, 100...原创 2020-04-07 20:22:51 · 212 阅读 · 0 评论 -
LeetCode——11.盛最多水的容器【双指针】
题解最初我们考虑由最外围两条线段构成的区域。现在,为了使面积最大化,我们需要考虑更长的两条线段之间的区域。如果我们试图将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。...原创 2020-04-07 20:09:54 · 265 阅读 · 0 评论 -
LeetCode——9.回文数
AC-Codeclass Solution {public: bool isPalindrome(int x) { if(x < 0 || (x % 10 == 0 && x != 0)) return false; if(x == 0) return true; ...原创 2020-04-07 19:49:48 · 154 阅读 · 0 评论 -
LeetCode——面试题01.07 旋转矩阵
题解假设一个 n∗nn*nn∗n 的矩阵,顺时针旋转后,对于(i,j)(i,j)(i,j) 位置来说他要顺时针转动,覆盖某一位置,下面探讨,它究竟去了哪里。毋庸置疑,对于任何一个位置,旋转4次,回到原来的位置。那么换个思路,也就是说,对于任何一个位置,可以把矩阵分为四个象限,每个象限的点都向顺时针迭代。(i,j)(i,j)(i,j) →(j,n−i)(j,n-i)(j,n−i)(j,...原创 2020-04-07 14:42:41 · 268 阅读 · 0 评论 -
LeetCode——42.接雨水【前后缀 & 双指针】
题解方法一:暴力的优化,前后缀数组预处理方法二:双指针AC-Code前后缀数组class Solution {public: int trap(vector<int>& height) { int n = height.size(); int* pre = new int[n]; ...原创 2020-04-04 20:00:58 · 1022 阅读 · 0 评论 -
LeetCode——1143.最长公共子序列【LCS & 标准代码、空间压缩】
题解标准的LCS,两套代码,一套标准LCS,一套空间压缩标准代码可以直接通过b数组逆推路径AC-Code标准LCSclass Solution {public: int longestCommonSubsequence(string text1, string text2) { int len1 = text1.length(); int len2 = text...原创 2020-04-04 18:52:57 · 362 阅读 · 0 评论 -
LeetCode——6. Z 字形变换【规律 & 模拟】
AC-Code方法一class Solution {public: string convert(string s, int numRows) { if (numRows == 1) return s; vector<string> rows(min(numRows, int(s.size()))); i...原创 2020-04-03 21:00:17 · 287 阅读 · 0 评论 -
LeetCode——8.字符串转整数(atoi)【有穷状态自动机DFA】
题解AC-Code#include <bits/stdc++.h>#include <unordered_map>using namespace std;typedef long long ll;class Solution {public: int myAtoi(string str) { Automation automation; f...原创 2020-04-03 17:36:10 · 333 阅读 · 0 评论 -
LeetCode——354.俄罗斯套娃信封问题(困难)【LIS & 二分】
题解w按照升序排序之后,对于h求LIS即可注意排序时,w相同的,要按照h降序排序。这样可以防止w相同,求h的lis出现违法情况class Solution {public: int maxEnvelopes(vector<vector<int>>& envelopes) { sort(envelopes.begin(), envelope...原创 2020-03-21 15:56:20 · 364 阅读 · 1 评论