自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 LeetCode 29. 两数相除

难度:中等。标签:数学,二分查找。第一反应是用减法暴力来做,肯定超时。使用二分的思想,见递归函数。边界值很容易出错,要注意判断。正确解法:class Solution { int div(int a, int b){ if(a < b)return 0; int n = b, m = 0, right = 1, left = 0; while(n < a){ m = n; left

2021-01-30 18:03:10 73

原创 LeetCode 778. 水位上升的泳池中游泳

难度:困难。跟昨天的每日一题 1631. 最小体力消耗路径 一样的。并查集 正确解法:class UnionfindSet{public: vector<int> parents; UnionfindSet(int n):parents(vector<int> (n)){ for(int i = 0; i < n; i++){ parents[i] = i; } } int fi

2021-01-30 17:10:26 62

原创 LeetCode 1631. 最小体力消耗路径

难度:中等。好的,这个题我不会。参考官方题解https://leetcode-cn.com/problems/path-with-minimum-effort/solution/zui-xiao-ti-li-xiao-hao-lu-jing-by-leetc-3q2j/二分法正确解法:class Solution { static constexpr int dirs[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public: int m

2021-01-29 17:50:12 89

原创 LeetCode 26. 删除排序数组中的重复项

难度:简单。正确解法:class Solution {public: int removeDuplicates(vector<int>& nums) { int n = nums.size(); if(n <= 1)return n; int temp = nums[0], end_num = nums[n-1]; int index = 1; for(int i = 1; i <

2021-01-28 19:40:30 24

原创 LeetCode 25. K 个一组翻转链表

难度:困难。比较绕,得想清楚。找到当前k个数中的最后一个,即代码中的end_k_node,如果这个节点存在,则继续下面的替换;否则结束。每次将当前的K组节点的第一个节点放到end_k_node的后面,直到第一个节点为end_k_node为止。正确解法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : v

2021-01-28 19:06:18 43

原创 LeetCode 24. 两两交换链表中的节点

难度:中等。熟悉链表操作。正确解法:/** * 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, ListNode *next)

2021-01-28 17:50:15 93

原创 LeetCode 724. 寻找数组的中心索引

难度:简单。先将数组所有元素的总和算出来,然后逐个遍历并判断。正确解法:class Solution {public: int pivotIndex(vector<int>& nums) { int n = nums.size(); if(n == 0)return -1; if(n == 1)return 0; int sum = 0; for(int i = 0; i < n; i+

2021-01-28 12:40:25 28

原创 LeetCode 23. 合并K个升序链表

难度:中等。重点在链表的操作,不要搞混了。正确解法:/** * 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, ListNod

2021-01-26 13:20:12 46

原创 LeetCode 22.括号生成

难度:中等。标签:字符串,回溯算法。与之前LeetCode 17.电话号码的字母组合那道题特别像。正确解法:class Solution { void get_result(vector<string>& result_list, string res, int n, int a, int b){ if(a == n && b == n){ result_list.push_back(res);

2021-01-26 12:34:47 63

原创 LeetCode 1128.等价多米诺骨牌对的数量

难度:简单。这个题的意思怪怪的,不太理解为什么要这样,不过做起来是很简单。用一个二维数组来存储这些数字。正确解法:class Solution {public: int numEquivDominoPairs(vector<vector<int>>& dominoes) { int n = dominoes.size(); if(n <= 1)return 0; int nums[10][10] = {0

2021-01-26 12:09:58 37

原创 LeetCode 19. 删除链表的倒数第 N 个结点

难度:中等。双指针,重点是思路,实现简单。正确解法:/** * 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, ListNod

2021-01-25 22:23:22 31

原创 LeetCode 959.由斜杠划分区域

难度:中等。这个题,我不会,看别人的思路。方法一参考:https://leetcode-cn.com/problems/regions-cut-by-slashes/solution/c-dong-hua-zhuan-huan-cheng-dao-yu-ge-sh-guve/然后问题同 200. 岛屿数量,遍历0的区域。我的实现:class Solution { int map[1001][1001] = {0}; void change_map(int i, int j,

2021-01-25 13:04:05 85

原创 LeetCode 674. 最长连续递增序列

难度:简单。class Solution {public: int findLengthOfLCIS(vector<int>& nums) { int n = nums.size(); if(n <= 1)return n; int result = 0; int i = 0; while(i < n){ int j = i + 1, k = 1;

2021-01-24 12:22:57 60

原创 LeetCode 989.数组形式的整数加法

难度:简单。考虑好各种情况就行。class Solution {public: vector<int> addToArrayForm(vector<int>& A, int K) { if(K == 0)return A; int A_num = A.size(); int temp = 0; int a_index = A_num - 1; int m = K;

2021-01-22 20:48:04 42

原创 LeetCode 17. 电话号码的字母组合

难度:中等。标签:深度优先搜索,回溯法,递归。正确解法:class Solution { map<char, string> phone = { {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}}; void DFS(string digits,

2021-01-21 16:30:43 79 1

原创 LeetCode 1489. 找到最小生成树里的关键边和伪关键边

难度:困难。标签:深度优先搜索,并查集。看了提示,需要用Kruskal算法来计算最小生成树,方法如下:计算最小生成树的权重为minWeightminWeightminWeight。遍历所有边,指定以当前边为最小生成树中的边来构建最小生成树,若构建成功且当nowWeight==minWeightnowWeight == minWeightnowWeight==minWeight 时,则该边为有效边;否则(构建不成功,或构建成功权重变大)为无效边。当边为有效边时,继续,进一步判断其为关键边或非关键边

2021-01-21 12:51:04 183 1

原创 LeetCode 10. 正则表达式匹配

难度:困难。标签:字符串,动态规划,回溯法。使用动态规划的方法,dp[i][j]dp[i][j]dp[i][j]表示sss的前iii个字符串与ppp的前jjj个字符串是否匹配,即dp[i][j]=isMatch(s[0...i−1],p[0...j−1])dp[i][j] = isMatch(s[0...i-1], p[0...j-1])dp[i][j]=isMatch(s[0...i−1],p[0...j−1])括号中为索引,数组dpdpdp的索引范围为dp[0...sn][0...pn]dp[0

2021-01-20 21:41:07 84

原创 LeetCode 18. 四数之和

难度:中等。标签:数组、哈希表、双指针。双指针按照【三数之和】的方法,固定两个数,多加一层循环。正确解法:class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { int n = nums.size(); vector<vector<int>> result;

2021-01-20 20:21:41 36

原创 LeetCode 16. 最接近的三数之和

难度:中等。标签:数组,双指针。将上一题的代码改一改就可以了。正确解法:class Solution { int my_abs(int a){ return a>=0?a:-a; }public: int threeSumClosest(vector<int>& nums, int target) { int n = nums.size(); if(n == 3)return (nums[0] +

2021-01-20 17:41:37 47

原创 LeetCode 15. 三数之和

难度:中等。标签:数组,双指针。开始没仔细看示例,导致理解有问题,不知道怎么做。之后看了下标签明白了,应该是先排序,后使用双指针来做。加入一些条件可以使程序更快。正确解法:class Solution { void swap(vector<int>& nums, int i, int j){ int k = nums[i]; nums[i] = nums[j]; nums[j] = k; } int

2021-01-20 17:25:23 44

原创 LeetCode 628. 三个数的最大乘积

难度:简单。先排序,再计算。正确解法:class Solution { void swap(vector<int>& nums, int i, int j){ int k = nums[i]; nums[i] = nums[j]; nums[j] = k; } int partition(vector<int>& nums, int left, int right){ i

2021-01-20 13:00:04 33

原创 LeetCode 12. 整数转罗马数字 13. 罗马数字转整数

难度:中等使用贪心的思想。正确解法:class Solution {public: string intToRoman(int num) { string s = ""; vector<string> str_list = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; vector<int> int_list = {10

2021-01-18 17:32:09 69

原创 LeetCode 11. 盛最多水的容器

方法一先用遍历的方法来解,设置一些条件可以尽可能地加快速度。解法:class Solution {public: int min_num(int a, int b){ return a<b?a:b; } int maxArea(vector<int>& height) { int n = height.size(); int max_volume = 0; for(int i = 0

2021-01-18 15:48:11 42 2

原创 LeetCode 721. 账户合并

借着这个题学一下并查集。并查集讲解:https://zhuanlan.zhihu.com/p/93647900/参考题解:https://leetcode-cn.com/problems/accounts-merge/solution/tu-jie-yi-ran-shi-bing-cha-ji-by-yexiso-5ncf/正确解法:class unionfindSet {public: vector<int> parent; vector<int> ran

2021-01-18 14:36:14 49

原创 LeetCode 123.买卖股票的最佳时机 |||

难度:困难暴力超时解法首先想到了比较暴力的方法,将数组在不同位置进行分段,然后分别计算两段的最大收益,最后选取最大的那个。思想都在代码里。结果应该是正确,但超时了的解法:class Solution {public: // get the index of max value in prices[left, right] int findMaxIndex(vector<int>& prices, int left, int right){ in

2021-01-09 18:29:05 61

原创 LeetCode 189.旋转数组

难度:中等。本来是很简单的题,但要求空间复杂度为O(1)。因此就需要找规律了,第一次找提交后错了一次。之后发现需要求出数组大小和k的最大公因数d,表明数组中有d组元素互相交换。找最大公因数的方法有三种:暴力法相减法:思路见代码辗转相除法step1. a存放较大的数,b存放较小的数step2. k = a % bstep3. 若k == 0, 则b是最大公因数step4. 否则:a = b, b = tempstep 5. 回到step2正确解法:class Solu

2021-01-08 17:15:44 121

原创 LeetCode 4.寻找两个有序数组的中位数

难度:困难。复杂度较高的解法(O(nlogn))直接合并两个数组后进行快排。class Solution {public: void swap(vector<int>& nums, int i, int j){ int k = nums[i]; nums[i] = nums[j]; nums[j] = k; } int partition(vector<int>& nums, in

2021-01-07 18:53:37 59

原创 LeetCode 547.省份数量

难度:中等。深搜,我用stack解决的。正确解法:class Solution {public: int findCircleNum(vector<vector<int>>& isConnected) { int flag[201] = {0}; int n = isConnected.size(); int num = 0; for(int i = 0; i < n; i++){

2021-01-07 11:53:03 157

原创 LeetCode 9.回文数

难度:简单开始有点问题,溢出了。进阶版,没有将int转换为字符串。正确解法:class Solution {public: int my_pow(int a, int b){ int result = 1; for(int i = 0; i < b; i ++){ result *= a; } return result; } bool isPalindrome(int x)

2021-01-06 22:11:48 54

原创 LeetCode 8.字符串转换整数

难度:中等。没啥难度,就想多一点就好了。考虑不周,导致WA了两次,没考虑下列情况:“000000002322”“00000-42a1234”之后又因为其他小错误交了几次,伤心。正确解法:class Solution {public: int my_pow(int a, int b){ int k = 1; for(int i = 0; i < b; i ++){ k *=a; } re

2021-01-06 21:21:22 125

原创 LeetCode 7.整数反转

难度:中等。主要是对溢出的判断比较麻烦,还要注意正数与负数绝对值的范围不同。INT_MAX: 2147483647INT_MIN: -2147483648正确解法:class Solution {public: int MAX = 2147483647; int my_pow(int a, int b){ int result = 1; for(int i = 0; i < b; i ++){ resul

2021-01-05 22:41:08 48

原创 LeetCode 6. Z字形变换

难度:中等。没啥技巧,就是找规律。可以从周期来考虑,以下述红框内的为一个周期。按照这个周期来找更具体地规律。正确解法:class Solution {public: string convert(string s, int numRows) { int len = s.length(); if(len < 2 || numRows < 2)return s; int midde_num = numRows - 2;

2021-01-05 21:39:18 72

原创 LeetCode 5. 最长回文子串

难度:中等。知道是动态规划,但好久没写代码有点忘了,看了下思路,如下:使用res[i][j]表示s[i]到s[j]是否为回文,则当 s[i] == s[j] 时,res[i][j] = res[ i+1 ][ j-1 ]否则,res[i][j] = 0边界取值:res[i][i] = 1;若s[i] == s[j], 则res[i][i+1] = 1,否则res[i][i+1] = 0计算时第一层循环为遍历步长,第二层遍历i的取值。正确解法:class Solution {pu

2021-01-05 20:52:41 53 1

原创 LeetCode 830. 较大分组的位置

难度:简单。注意一下边界特殊情况,"aaa"等。正确解法:class Solution {public: vector<vector<int>> largeGroupPositions(string s) { int len = s.length(); vector<vector<int>> result; if(len < 3)return result; char now

2021-01-05 20:15:08 42

原创 LeetCode 3.无重复字符的最长子串

难度:中等。不能暴力搜索,用到了动态规划的思想。使用一个数组a存储从每个索引开始的最长子串,则L(i + 1) >= L(i) - 1 从i+1处进行最长字串的计算不用从i+1开始计算,从i+L[i]处进行判断。正确解法:bool is_repetition(char *s, int begin_index, int cur_index){ for(int i = begin_index; i < cur_index; i++){ if(s[i] == s

2021-01-04 21:17:34 67

原创 LeetCode 2. 两数相加

难度:中等题目不难,就是得想清楚链表的连接。两个关键点:生成新的结构体节点要分配内存。 struct ListNode *t1 = (struct ListNode *)malloc(sizeof(struct ListNode));连接l链表必须用当前链表的最后一个节点的next 等于新节点。// l1是最后一个有效节点,l1->next = NULL// rightl1->next = t1;// wrongl2 = l1->next;l2 = t1

2021-01-04 20:46:03 50

原创 LeetCode 1. 两数之和

这是刷的第一道题,因为没看官方给的代码,写了完整的C++代码,包括字符串的处理。正确解法:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int num = nums.size(); vector<int> result(2); bool is_end = false; for(int

2021-01-04 19:39:27 40

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除