
LeetCode/C++
C++代码实现LeetCode
Lambda_eta
这个作者很懒,什么都没留下…
展开
-
1. 两数之和/C++
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]该题使用哈希表c...原创 2019-03-25 19:06:34 · 229 阅读 · 0 评论 -
2. 两数相加/C++
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* a...原创 2019-05-07 10:37:45 · 435 阅读 · 0 评论 -
3. 无重复字符的最长子串/C++
滑动窗口int lengthOfLongestSubstring(string s) { if (s.empty()) return 0; int size = s.size(); int left = 0;//left指向当前字符串的头部 int right = 1;//right指向当前字符串的尾部的下一个位置 int maxVal = 1; while (...原创 2019-04-22 17:53:40 · 250 阅读 · 0 评论 -
4. 寻找两个有序数组的中位数/C++
中位数有2个特点: 1、中位数左边的数与右边的数个数相等 2、中位数左边的数都比右边的数要小实质是找到一条分界线,将2个数组的左边和右边分开,并且使左边的个数与右边差一个(数组元素总数为奇数时)或者相等(数组元素为偶数)。设nums1的分界线为i,nums2的分界线为j。利用二分查找法在nums1数组找分界线i,由于左边个数与右边个数相等或差一,因此与i对应的j也很容易确定。在二分查...原创 2019-03-25 17:11:53 · 761 阅读 · 0 评论 -
5. 最长回文子串/C++
示例1的dp表格:string longestPalindrome(string s) { int size = s.size(); vector<vector<bool>> dp(size, vector<bool>(size, false)); for (int i = 0; i < size; ++i) dp[i][i] = tru...原创 2019-05-07 11:23:44 · 492 阅读 · 0 评论 -
6. Z 字形变换/C++
第一行:行0中的字符位于索引2*(numRows-1)处;最后一行:行numRows−1中的字符位于索引2(numRows−1)k+numRows−1处;内部的行:行i中的字符位于索引2(numRows−1)k-i以及2(numRows−1)k+numRows+1处;将每个向下以及向右上的部分看作一个循环。对于示例2,循环1:LEET CO;循环2:DEIS HI;循环3:RINGst...原创 2019-07-29 09:07:50 · 257 阅读 · 0 评论 -
7. 整数反转/C++
看官方答案有些复杂。这里直接用long long来装结果,返回时转成int即可,这样做的好处就是方便判断溢出。int reverse(int x) { long long res=0; while(x!=0){ int pop = x%10; x/=10; res=res*10+pop; if(...原创 2019-05-08 08:57:38 · 227 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)/C++
先确定有效字符串的起点和终点,然后再依据有无符号、正负号来处理字符串。由于存在溢出的问题,可以用long long来装结果,一旦发现不在int的范围内就直接返回。int myAtoi(string str) { int start=0,i=0; long long val=0; if(str.empty()) return 0; //...原创 2019-05-05 12:10:26 · 252 阅读 · 0 评论 -
9. 回文数/C++
反转一半的数字,将x的末尾数字摘下来放到reverse的末尾,摘掉一半数字的条件是x>reverse。但是此方法有一个缺陷:当reverse为个位数,x为0时,x==reverse/10,会判断为真。可是诸如10或者200之类的数显然不是回文数。好在可以事先用x%10==0 && x!=0过滤掉。bool isPalindrome(int x) { //考虑特殊条件...原创 2019-05-08 14:12:38 · 375 阅读 · 0 评论 -
10. 正则表达式匹配/C++
dp[i][j]表示text[i...]与pattern[j...]是否匹配bool isMatch(string s, string p) { vector<vector<bool>> dp(s.size()+1,vector<bool>(p.size()+1,false)); dp[s.size()][p.size()] = true;...原创 2019-07-23 17:21:59 · 238 阅读 · 0 评论 -
11. 盛最多水的容器/C++
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色...原创 2019-03-25 23:04:10 · 916 阅读 · 0 评论 -
12. 整数转罗马数字/C++
string intToRoman(int num) { vector<int> val = { 1000,900,500,400,100,90,50,40,10,9,5,4,1 }; vector<string> dic = { "M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I" }; ...原创 2019-07-29 10:02:12 · 323 阅读 · 0 评论 -
13. 罗马数字转整数/C++
int romanToInt(string s) { if (s.empty()) return 0; unordered_map<char, int> dict = { {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100},...原创 2019-07-12 09:32:17 · 215 阅读 · 0 评论 -
14. 最长公共前缀/C++
水平扫描法。容易想到,但是效率不行。string longestCommonPrefix(vector<string>& strs) { if(strs.empty()) return ""; int i=0; string res; while(i<strs[0].size()){ char ...原创 2019-05-08 14:28:49 · 363 阅读 · 0 评论 -
15. 三数之和/C++
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; vector<int> vec(3); sort(nums.begin(), nums.end()); //如果不判断nums是否为空的话,要把nums...原创 2019-05-09 14:36:46 · 202 阅读 · 0 评论 -
16. 最接近的三数之和/C++
int threeSumClosest(vector<int>& nums, int target) { int size = nums.size(); int mindif = INT_MAX; int minsum; sort(nums.begin(), nums.end()); for (int i = 0; i < size - 2; +...原创 2019-05-09 15:10:59 · 183 阅读 · 0 评论 -
17. 电话号码的字母组合/C++
回溯法class Solution {public: vector<string> letterCombinations(string digits) { res.clear(); if(digits.empty()) return res; func(digits,0,""); ...原创 2019-04-25 09:57:44 · 495 阅读 · 0 评论 -
18. 四数之和/C++
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; sort(nums.begin(), nums.end()); int size = nums.size(); for(i...原创 2019-08-10 11:09:19 · 348 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点/C++
由于题目说n保证有效,因此可以剩下不少麻烦。就是用两个指针,第1个指针先走n,第2个指针再与第1个指针一起走,当第1个指针到队尾时,第2个指针就指向要删掉的节点。当然其中细节还很多,比如第2个指针实际上要指的是删除节点的前一个节点。ListNode* removeNthFromEnd(ListNode* head, int n) { //如果链表没有节点或者只有1个节点,直接返回null...原创 2019-06-10 17:16:56 · 276 阅读 · 0 评论 -
20. 有效的括号/C++
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。示例 1:输入: “()” 输出: true示例 2:输入: “()[]{}” 输出: true示例 3:输入: “(]” 输出: false示例 4:输入: “([...原创 2019-04-22 14:06:33 · 102 阅读 · 0 评论 -
21. 合并两个有序链表/C++
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* m...原创 2019-05-10 10:18:48 · 108 阅读 · 0 评论 -
22. 括号生成/C++
class Solution {public: vector<string> res; vector<string> generateParenthesis(int n) { generate("",0,0,n); return res; } void generate(string str, int le...原创 2019-06-10 20:38:20 · 372 阅读 · 0 评论 -
23. 合并K个排序链表/C+
分治法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNod...原创 2019-06-03 09:37:26 · 189 阅读 · 0 评论 -
24. 两两交换链表中的节点/C++
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* s...原创 2019-08-01 10:34:11 · 123 阅读 · 0 评论 -
25. k个一组翻转链表/C++
这里用的是递归的方法。p1是下一个序列的头节点p2是当前序列的头节点因此第2个while的第一轮就是此序列头节点指向下个序列头节点后面就是普通的反转链表最后一轮,p1到了当前序列的尾节点(也是反转后的头节点)以此类推/** * Definition for singly-linked list. * struct ListNode { * int val; * ...原创 2019-04-08 20:59:54 · 252 阅读 · 0 评论 -
26. 删除排序数组中的重复项/C++
双指针法:只要i与j所指相同,则增加j以跳过重复项。int removeDuplicates(vector<int>& nums) { if(nums.empty()) return 0; int i = 0; for(int j = 1;j<nums.size();j++){ if(nums[i]!...原创 2019-05-29 10:26:07 · 384 阅读 · 0 评论 -
27. 移除元素/C++
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均...原创 2019-04-22 14:15:00 · 189 阅读 · 0 评论 -
28. 实现strStr()/C+
KMPclass Solution {public: vector<int> getnext(string s){ int n = s.size(); vector<int> next(n); int i=0,j=-1; next[0]=-1; while(i<n-1){ ...原创 2019-07-24 16:21:21 · 126 阅读 · 0 评论 -
29. 两数相除/C++
int divide(int dividend, int divisor) { if(divisor == -1 && dividend == INT_MIN) return INT_MAX; if(divisor == 1 && dividend == INT_MIN) return INT_MIN; if(divisor =...原创 2019-07-24 17:24:03 · 463 阅读 · 0 评论 -
31. 下一个排列/C++
字典序如下: [1]设P是1~n的一个全排列:p=p1p2…pn=p1p2…pj-1pjpj+1…pk-1pkpk+1…pn1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pi<pi+1}2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk,即 k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是所有大于...原创 2019-07-23 15:34:47 · 320 阅读 · 0 评论 -
32. 最长有效括号/C++
int longestValidParentheses(string s) { stack<int> st; st.push(-1); int res=0; for(int i=0;i<s.size();++i){ if(s[i]=='('){ st.push(i); }else{ ...原创 2019-07-23 16:05:23 · 239 阅读 · 0 评论 -
33. 搜索旋转排序数组/C++
先利用二分查找去找分界点,然后就可以分为2个有序区间,在某一个区间里再二分查找。class Solution {public: int search(vector<int>& nums, int target) { if (nums.empty()) return -1; int point = findPartition(nums); //如果没有分...原创 2019-06-01 09:41:12 · 154 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置/C++
class Solution {public: void binarySearch(vector<int>& nums, int target, int left, int right, int& l, int& r){ if(left > right) return; ...原创 2019-07-09 16:27:42 · 324 阅读 · 0 评论 -
35. 搜索插入位置/C++
int searchInsert(vector<int>& nums, int target) { int left=0,right=nums.size()-1; while(left<=right){ int mid = left+(right-left)/2; if(nums[mid]==target) ...原创 2019-07-11 15:55:54 · 121 阅读 · 0 评论 -
36. 有效的数独/C++
bool isValidSudoku(vector<vector<char>>& board) { vector<unordered_map<char,int>> rows(9),cols(9),boxs(9); for(int i=0;i<9;++i){ for(int j=0;j<9;++j...原创 2019-07-16 19:30:55 · 389 阅读 · 0 评论 -
37. 解数独/C++
回溯法class Solution {private: vector<vector<bool>> rowCheck;//rowCheck[i][j]表示数字j+1是否在第i行出现(行数从0开始) vector<vector<bool>> colCheck;//colCheck[i][j]表示数字j+1是否在第i列出现 v...原创 2019-04-29 16:57:08 · 713 阅读 · 0 评论 -
38. 报数/C++
模拟过程class Solution {public: string countAndSay(int n) { string res = "1"; for (int i = 1; i < n; ++i) res = next(res); return res; } string next(string str) { int i = 0, n = str.si...原创 2019-07-16 11:28:30 · 132 阅读 · 0 评论 -
39. 组合总和/C++
标准回溯法class Solution {private: vector<vector<int>> res; vector<int> row; void combination(vector<int>& candidates, int target, int index){ //不符合条件,返...原创 2019-04-29 11:15:36 · 539 阅读 · 0 评论 -
40. 组合总和 II/C++
与不同的地方有2点:使用set去重递归时,要用i+1,因为已经使用过candidates[i]了,不能重复使用class Solution {private: //set去重 set<vector<int>> res; vector<int> row; void combination(vector<int...原创 2019-04-29 14:39:00 · 620 阅读 · 0 评论 -
41. 缺失的第一个正数/C++
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0] 输出: 3示例 2:输入: [3,4,-1,1] 输出: 2示例 3:输入: [7,8,9,11,12] 输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。解题思路:遍历一遍数组。将1放到第1位(逻辑上的第1位,物理上的第0位),将2放到第2位,以此类推。...原创 2019-04-16 22:32:31 · 242 阅读 · 0 评论