Leetcode
leetcode从零开始
TempterCyn
这个作者很懒,什么都没留下…
展开
-
Leetcode 第3题
int lengthOfLongestSubstring(string s) { vector<int> pos(256,-1); int left=-1,res=0; for(int i=0;i<s.size();i++) { if(pos[s[i]] > left) ...原创 2018-09-27 18:17:28 · 169 阅读 · 0 评论 -
leetcode 40
与上题类似,用if(i>start&&candidates[i]==candidates[i-1]) continue 来去掉重复的结果。例中 1 2 2 2 5 ,将1 push 将第二个2push 第三个2 因为与第二个2相同则不push 排除了相同的结果。void combinationSum2DFS(vector<vector<int>>...原创 2018-10-15 15:01:53 · 263 阅读 · 0 评论 -
leetcode 43
首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。例:123*456 1 2 3 ...原创 2018-10-16 12:57:57 · 783 阅读 · 0 评论 -
leetcode 46
通过维护visited数组来判断nums[i]是否已经在输出中,若在则跳过,若不在则将其push进out,进行下次dfsvoid permuteDFS(vector<vector<int>>& res,vector<int>& out,vector<int>& nums,vector<int>& vi...原创 2018-10-18 17:11:50 · 101 阅读 · 0 评论 -
leetcode 47
此与上题有所不同,会有相同的数字。先将数组排序,将相同的数字排到一起。然后进行判断,若nums[i]与上一个数字相等且两个数字都未被访问过,则可以跳过当前数字,这样可以避免重复。void permuteUniqueDFS(vector<vector<int>>& res, vector<int>& out, vector<int>...原创 2018-10-18 19:08:37 · 181 阅读 · 0 评论 -
leetcode 48
数组旋转问题,先设任一点(i,j),它会旋转到第j行,第k列,其中k+i=n-1,所以k=n-1-i。由此类推,(j,n-1-i)-》(n-1-i,n-1-j)-》(n-1-j,n-1-(n-1-i))=(n-1-j,i)最后反推即可。且仅有前n/2行需要旋转,因为数组旋转是最外层旋转后内层旋转,所以j从i到n-1-ivoid rotate(vector<vector<i...原创 2018-10-21 21:22:02 · 104 阅读 · 0 评论 -
leetcode 49
map*1 统计每个str出现过的字母并通过unordered_map:string - > vector<string>以出现的字母为key,把与key中字母相同的字符串存入key对应的vector中,最后遍历map将每个vector存入res中并输出vector<vector<string>> groupAnagrams(vector<st...原创 2018-10-23 13:33:37 · 328 阅读 · 1 评论 -
Leetcode 50
要满足O(n)需用递归pow(x,n) = pow(x,n/2)*pow(x,n/2) n为偶数时pow(x,n) = pow(x,n/2)*pow(x,n/2)*x n为奇数时double myPow(double x, int n) { if(n<0)return 1/power(x,-n); return power(x,n); }...原创 2018-10-23 23:42:59 · 201 阅读 · 0 评论 -
Leetcode 53 DP*1
dp(dynamic programming)DP 是一种编程思想,主要用于解决最优解类型的问题。其思路是为了求解当前的问题的最优解,使用子问题的最优解,然后综合处理,最终得到原问题的最优解。但是也不是说任何最优解问题都可以DP,使用dp的问题一般满足下面的两个特征:(1)最优子结构,就是指问题可以通过子问题最优解得到;体现为找出所有的子问题最优解,然后取其中的最优;(2)重叠...原创 2018-10-25 14:46:49 · 106 阅读 · 0 评论 -
Leetcode 51
N-Queens first hard这与八皇后问题并无本质区别,通过一个一维数组vis记录每一行第几个位置拜访皇后,再往下递归时判断是否与之前拜访的皇后在同一列,同一正对角线,同一副对角线上,最后将本次递归的结果pop,以进行下次递归。bool available(vector<int> &vis, int row, int col){ for (int i =...原创 2018-10-25 17:49:53 · 177 阅读 · 0 评论 -
leetcode 52
与leetcode 51 基本相同,区别在于通过一个count将每次递归结果计数,最后返回count。class Solution {public: int count = 0; bool available(vector<int> &vis,int row,int col) { for (int i = 0; i<row;...原创 2018-10-29 15:04:19 · 172 阅读 · 0 评论 -
leetcode 54
这题做到一半才想起来原来在程序设计课的作业上做过这道题,原理就是按照螺旋的方式将二维数组的数存进一维数组中,用up down left right分别表示上下左右四条边哪已经存进数组中。若存进则up++ down-- left++ right--若left>right或up>down就break 表示所有的数都存进了数组中。class Solution {public: ...原创 2018-10-29 19:12:17 · 128 阅读 · 0 评论 -
leetcode 55
一开始的想法是用backtracking 遍历每种走法 level>=数组最大位置则return true 但这么写会超时。bool DFS(vector<int>& nums,int level,int n) { if(level >= n)return true; else{ for(int i = ...原创 2018-10-29 22:06:58 · 128 阅读 · 0 评论 -
leetcode 45
与jump game 1类似,这次我们找到能够跳到的最远的位置的范围,遍历这个范围中的每个点找到下一次跳远能跳到的最远的位置,这样就能保证跳的次数最短,若遍历以后跳到最远的位置不变则说明不能跳到末尾,return -1int jump(vector<int>& nums) { int n = nums.size(),pre = 0,cur = 0,i = ...原创 2018-10-30 15:52:33 · 115 阅读 · 0 评论 -
leetcode 56
先将区间按照左区间的大小从小到大排序(没太看懂库函数sort的第三个参数的用法,自己写的cmp函数会报错)然后遍历数组只需对比每个区间的左区间与现有的右界的大小,将结果push进res中struct Interval { int start; int end; Interval() : start(0), end(0) {} Interval(int ...原创 2018-10-31 23:02:16 · 109 阅读 · 0 评论 -
leetcode 39
DFS 基本能懂,需练习才能自主做void combinationSumDFS(vector<vector<int>> &res,vector<int> &out,vector<int>& candidates,int target,int level) { if(target<0) ...原创 2018-10-14 21:49:55 · 168 阅读 · 0 评论 -
Leetcode 36
用二维数组标记每行,每列,每块出现的数字,重复出现则return false(vector初始化二维数组) bool isValidSudoku(vector<vector<char>>& board) { vector<vector<int>> visrow(9,vector<int>(9,0)),vi...原创 2018-10-11 22:52:17 · 195 阅读 · 0 评论 -
Leetcode 33
需要O(lgn),用二分查找,关键在于找到中间的左边还是右边是排序好的若nums[mid]>nums[right],则中间左边是排序好的,再判断target在左或右反之,中间右边是排序好的。int search(vector<int>& nums, int target) { int r=nums.size()-1,l=0,mid; ...原创 2018-10-09 13:44:49 · 280 阅读 · 0 评论 -
Leetcode 第5题
int Expand(int L,int R,string s) { while(L>=0&&R<s.size()) { if(s[L]==s[R]) { L--; R++; } ...原创 2018-09-27 18:18:58 · 183 阅读 · 0 评论 -
Leetcode 第6题
string convert(string s, int numRows) { if(numRows==1)return s; vector<string> res(numRows, ""); for (int i = 0; i<s.size(); i++) { int p = i % (2 * (numRows - 1)), q = 2 * (num...原创 2018-09-27 18:19:47 · 210 阅读 · 0 评论 -
Leetcode 第8题
int myAtoi(string str) { if (str.empty()) return 0; int sign = 1, base = 0, i = 0, n = str.size(); while (i < n && str[i] == ' ') ++i; if (str[i] == '+' || ...原创 2018-09-27 18:20:45 · 265 阅读 · 0 评论 -
Leetcode 第11题
int maxArea(vector<int>& height) { int max=0,s=0; for(int i=0;i<height.size();i++) for(int j=i;j<height.size();j++) { if(height...原创 2018-09-27 18:21:39 · 231 阅读 · 0 评论 -
Leetcode 第12题
string intToRoman(int num) { string res; vector<int> val{1000,900,500,400,100,90,50,40,10,9,5,4,1}; vector<string> rom{"M","CM","D","CD","C","XC","L","XL","X","IX"...原创 2018-09-27 18:22:39 · 250 阅读 · 0 评论 -
Leetcode 第15题
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; if(nums.size()<=2)return res; sort(nums.begin(),nums.end()); ...原创 2018-09-27 18:23:28 · 173 阅读 · 0 评论 -
Leetcode 第16题
int threeSumClosest(vector<int>& nums, int target) { int sum=nums[0]+nums[1]+nums[2]; int dif=abs(target-sum); sort(nums.begin(),nums.end()); for(int i=0;i&l...原创 2018-09-27 18:24:11 · 179 阅读 · 0 评论 -
Leetcode 第17题
first DFSvoid DFS(string digits,vector<string> dic,int level,string out,vector<string> &res) { if(level==digits.size()) { res.push_back(out); ...原创 2018-09-27 18:24:57 · 167 阅读 · 0 评论 -
Leetcode 第18题
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if(nums.size()<=3)return res; sort(nums.begin(),nums...原创 2018-09-27 18:25:28 · 204 阅读 · 0 评论 -
Leetcode 19
ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head->next)return NULL; ListNode* p=head,*q=head; for(int i=0;i<n;i++)q=q->next; if(!q)retur...原创 2018-09-29 20:58:50 · 144 阅读 · 0 评论 -
Leetcode 22
void parenthesesDFS(int left,int right,string out,vector<string>& res) { if(left>right) return; if(left==0&&right==0) res.push_back(out); ...原创 2018-10-02 13:42:01 · 151 阅读 · 0 评论 -
Leetcode 24
用dummy解决p->next->next判断问题,多画图才能看懂。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; *...原创 2018-10-03 22:00:12 · 236 阅读 · 0 评论 -
Leetcode 29
按位运算左移<<1相当于*2,右移>>1相当于/2;用if排除INT_MIN除以-1的问题int divide(int dividend, int divisor) { if(divisor==0||(dividend==INT_MIN&&divisor==-1))return INT_MAX; long long ...原创 2018-10-07 17:30:44 · 217 阅读 · 0 评论 -
Leetcode 31
1 5 8 4 7 6 5 3 1->1 5 847 6 531->1 5 8 57 6 431->1 5 8 51 3 4 6 7void nextPermutation(vector<int>& nums) { int i=nums.size()-2,j=nums.size()-1; whi...原创 2018-10-08 13:18:43 · 114 阅读 · 0 评论 -
leetcode 58
简单题int lengthOfLastWord(string s) { int res = 0,i=s.size()-1; for(;i>=0;i--) { if(s[i]!=' ')break; } if(i==-1)return 0; for(;i>=0;i...原创 2018-11-02 00:36:14 · 91 阅读 · 0 评论 -
leetcode 59
本以为会写很长时间结果一边就过了这题与上一道螺旋矩阵思路基本相同,通过四个参数left right top bottom来完成螺旋的操作vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n,vector<int>(n)); ...原创 2018-11-05 21:25:58 · 172 阅读 · 0 评论 -
leetcode 80
用erase函数,若nums[i]==nums[i-1]&&nums[i]==nums[i-2] 则调用erase,且i--最后returnnums.size();int removeDuplicates(vector<int>& nums) { if(nums.size()<=2)return nums.size(); ...原创 2018-11-22 20:59:31 · 233 阅读 · 0 评论 -
leetcode 81
通过mid和right的大小判断mid左或右是有序的,若mid和right的值相等,则需要right--。假设原数组是{1,2,3,3,3,3,3},那么旋转之后有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},这样的我们判断左边缘和中心的时候都是3,如果我们要寻找1或者2,我们并不知道应该跳向哪一半。解决的办法只能是对边缘移动一步,将重复的去掉,这样就能转换成无重复的情...原创 2018-12-02 21:55:32 · 461 阅读 · 2 评论 -
leetcode 82
我们需要记录前指针以及现指针并从头开始,所以通过一个前驱指针start start->next = head 进行循环ListNode* deleteDuplicates(ListNode* head) { if(head==NULL||head->next==NULL)return head; ListNode* start = new List...原创 2018-12-03 11:35:13 · 178 阅读 · 0 评论 -
leetcode 83
比上题更简单,只需遍历链表,重复则跳过ListNode* deleteDuplicates(ListNode* head) { if(!head||!head->next)return head; ListNode* p = head; while(p&&p->next){ if(p->...原创 2018-12-04 10:38:42 · 367 阅读 · 0 评论 -
leetcode 86
先找到第一个大于等于target的数p,然后从这个数开始往后遍历链表,若比target小则放在p之前ListNode* partition(ListNode* head, int x) { ListNode* dummy = new ListNode(-1); dummy->next = head; ListNode *p = dummy...原创 2018-12-06 10:41:36 · 319 阅读 · 0 评论 -
leetcode 88
与merge sorted list思路相同,只是为数组存储void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { vector<int> res(m+n,0); int i=0,j=0,k=0; while(i&l...原创 2018-12-06 10:42:56 · 120 阅读 · 0 评论