![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
Kadima°
行至水穷处,坐看云起时
展开
-
【贪心算法】【二分查找】【双指针】【二叉树】【深度优先】【广度优先】【动态规划】
69.Sqrt(x)牛顿迭代法34. 在排序数组中查找元素的第一个和最后一个位置使用二分法实现c++中的lower_bound(返回有序数组中第一个>=target的元素)和upper_bound函数(返回有序数组中第一个>target的元素),如果不存在时均返回end...原创 2021-09-24 09:34:29 · 366 阅读 · 0 评论 -
C++万能头文件——#include<bits/stdc++.h>
介绍#include<bits/stdc++.h>包含了目前c++所包含的所有头文件!!!!对比使用前:#include <iostream>#include <cstdio>#include <fstream>#include <algorithm>#include <cmath>#include <deque>#include <vector>#include <queue>原创 2021-09-22 16:20:03 · 1181 阅读 · 0 评论 -
Leetcode刷题最全资料整理
CSDN博客园原创 2021-01-22 20:53:27 · 269 阅读 · 0 评论 -
101. 对称二叉树
101. 对称二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(null原创 2021-04-23 21:44:14 · 52 阅读 · 0 评论 -
100. 相同的树
100. 相同的树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullp原创 2021-04-23 21:15:41 · 53 阅读 · 0 评论 -
130. 被围绕的区域
130. 被围绕的区域//解题思路://如果遇到边沿为O,采用深度优先搜索与其相连的每个位置是否为O,如果是就标记为#;class Solution {public: int m,n; void dfs(vector<vector<char>>& board, int i, int j) { if(i < 0 || i >= m || j < 0 || j >= n || board[i][j] != '原创 2021-04-23 17:05:29 · 58 阅读 · 0 评论 -
63. 不同路径 II
63. 不同路径 II//先自己尝试一下,仍然是动态规划三步走//1.定义dp二维数组的含义,dp[i][j]表示到达第i行第j列的总路径个数//2.状态转移方程:if(obstacleGrid[i][j] == 1) dp[i][j] = 0;//否则的话,dp[i][j] = dp[i-1][j] + dp[i][j-1]//定义边界初始条件,初始条件的定义也要注意,第一行和第一列中一旦出现障碍物,其后的所有位置都为0,因此可以使用标志位表示class Solution {public:原创 2021-04-15 11:33:28 · 57 阅读 · 0 评论 -
3. 无重复字符的最长子串
3. 无重复字符的最长子串//解题思路://通过begin与i两个指针维护一个滑动窗口//使用char_map来记录字符串中元素出现的个数//使用word来临时存放子串//在遍历过程中,如果没有出现重复字符,word将其添加进来,同时与result进行比较,谁长result就保存谁//如果出现重复字符,就移动begin指针,在移动过程中删除char_map中记录的数值,知道重复元素在char_map中只出现一次,然后将begin到i之间的字符更新给word//就这道题目而言不需要返回最长的子串原创 2021-04-14 10:58:04 · 61 阅读 · 0 评论 -
53. 最大子序和
53. 最大子序和//定义dp数组的含义:dp[i]表示从第0个元素到该元素的最大连续子数组之和#include<vector>#include<algorithm>class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); if(n < 2) return nums[0]; //创建dp数原创 2021-04-14 09:48:28 · 98 阅读 · 0 评论 -
5. 最长回文子串
5. 最长回文子串#include<vector>#include<string>#include<iostream>//这个其实没有用到ACM模式会经常用到class Solution {public: string longestPalindrome(string s) { int n = s.size();//获取字符串的长度 //如果字符串的长度小于等于1,一定是回文子串直接返回 if(n <原创 2021-04-14 09:29:34 · 111 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return vector<int>{-1,-1}; int left = lower_bound(nums,target); int right = upper原创 2021-03-26 23:55:15 · 62 阅读 · 0 评论 -
69. x 的平方根
69. x 的平方根//求解问题都可以使用牛顿迭代法实现//f(x) = x^2 - a = 0//牛顿迭代法公式:An+1 = An - f(An) / f(An)'class Solution {public: int mySqrt(int x) { long a = x; while(a * a > x) { a = (a + x / a) / 2; } return a;原创 2021-03-26 23:19:42 · 63 阅读 · 0 评论 -
69. x 的平方根
69. x 的平方根//牛顿迭代法 Xn+1 = Xn + f(Xn) / f(Xn)'class Solution {public: int mySqrt(int x) { long n = x; while(n * n > x) { n = (n + x / n) / 2; } return n; }};原创 2021-03-23 22:06:49 · 77 阅读 · 0 评论 -
680. 验证回文字符串 Ⅱ
680. 验证回文字符串 Ⅱ//回文,最多只能删除一个//解题思路:双指针,如果遇到不相等的,删除后再判断剩余字符串是否是回文//需要注意的是删除有两种方式,删除left或者删除right,因此单独写一个判断字符串是否是回文的子函数比较方便class Solution {public: bool validPalindrome(string s) { int left = 0; int right = s.size()-1; while(le原创 2021-03-20 22:20:54 · 58 阅读 · 0 评论 -
633. 平方数之和
633. 平方数之和//因为leetcode上的测试用例的范围非常大,因此一定要使用unsigned int,否则会溢出class Solution {public: bool judgeSquareSum(int c) { unsigned int l = 0; unsigned int r = sqrt(c); while(l <= r) { unsigned int sum = l*l + r原创 2021-03-20 20:57:23 · 58 阅读 · 0 评论 -
76. 最小覆盖子串
76. 最小覆盖子串class Solution {public: string minWindow(string s, string t) { vector<int> chars(128,0); vector<bool> flag(128,false); //循环获取t中字符 for(int i = 0; i < t.size(); i++) { flag[t[原创 2021-03-20 20:09:17 · 55 阅读 · 0 评论 -
142. 环形链表 II
142. 环形链表 II/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *detectCycle(ListNode *head) { ListNod原创 2021-03-20 18:35:26 · 63 阅读 · 0 评论 -
88. 合并两个有序数组
88. 合并两个有序数组class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int pos = m-- + n-- - 1; while(m >= 0 && n >= 0) { nums1[pos--] = nums1[m] &g原创 2021-03-20 16:55:17 · 48 阅读 · 0 评论 -
167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组//双指针经典题目//同向双指针一般用来查找区间//异向双指针一般用来查找元素,并且是有序数组class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { if(numbers.size()<2) return {}; int left = 0,right = numbers.size原创 2021-03-20 16:31:05 · 59 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II//画图发现最终结果就是折线图的所有上升区间的首尾//所以问题就变成了怎么找上升区间的首尾//动态规划的解法://定义dp[i][0]表示第i天交易结束后没有持有股票的最大利润//定义dp[i][1]表示第i天交易结束后手里持有股票的最大利润//状态转移方程://dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])//今天没有股票,要么昨天就没有股票,要么昨天有股票,今天卖掉了,所以加上今天的股票价格//dp原创 2021-03-20 16:03:04 · 66 阅读 · 0 评论 -
763. 划分字母区间
763. 划分字母区间//逻辑思维能力真的很重要,让我们一步一步分析//贪心思想,关键字:尽可能多的片段,要想尽可能多该划分时候就要及时划分//根据限制条件,同一个字母最多出现在一个片段中,比如包含a字母的片段它的终止位置一定不能小于a字母最后出现的位置#include<unordered_map>class Solution {public: vector<int> partitionLabels(string S) { //创建返回结果数组原创 2021-03-20 15:50:17 · 57 阅读 · 0 评论 -
452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球//贪心思想://要想使弓箭数量最少,就要是气球重叠区间最多//思路:先对气球首端或者尾端进行排序//然后始终通过保留最小区间的方式进行class Solution {public: int findMinArrowShots(vector<vector<int>>& points) { if(points.size() < 2) return points.size(); //首先对气原创 2021-03-20 11:28:23 · 53 阅读 · 0 评论 -
605. 种花问题
605. 种花问题//没看出来怎么使用的贪心思想,整体解题思路就是,每次跳两个,如果当前位置为0就进行判断,如果已经是最后一个,直接赋值为1,如果不是就判断其后面一个是否为1,不是就果断赋值为0。整体思路没毛病,但是确实没看出来使用的算法思想class Solution {public: bool canPlaceFlowers(vector<int>& flowerbed, int n) { for(int i = 0; i < flowerbed.原创 2021-03-19 23:13:53 · 51 阅读 · 0 评论 -
435. 无重叠区间
435. 无重叠区间//解题思路:要想使得移出的区间最小,那么区间的范围就要尽可能的小,这样就有两种思路://1.如果根据区间的末端进行排序,那么就希望选取的区间末端尽可能的小,这样才能容纳最多的区间//2.如果根据区间的首端进行排序,那么就希望选取的区间首端尽可能的大,这样才能容纳最多的区间bool compare(vector<int>& a, vector<int>& b){ return a[1] < b[1];}class Sol原创 2021-03-19 22:17:57 · 51 阅读 · 0 评论 -
88. 合并两个有序数组
88. 合并两个有序数组class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int size = m + n - 1; while(n > 0) { //一定要加上m==0,即使nums1数组已经空了,也要继续将nums2数组插入到nums1中原创 2021-03-15 23:00:52 · 52 阅读 · 0 评论 -
70. 爬楼梯
70. 爬楼梯//动态规划的简单题,因为每次只能走一个台阶或者两个台阶、//因此对于第n个台阶,到达它的方法只有两种,即从第n-1到达或者从第n-2到达//那么到达第n个台阶的方法的个数就等于到达第n-1阶台阶的个数和第n-2阶台阶的个数//因此就可以找到状态转移方程//然后就是找边界值,边界值就是到达第1阶和到达第2阶台阶的个数////动态规划的解题套路:三步走//第一步:定义dp数组的含义,明确dp[i]所表示的意义//第二步:找到状态转移方程,即dp[i]与dp[i-1],dp[i-原创 2021-03-15 21:55:49 · 70 阅读 · 0 评论 -
66. 加一
66. 加一class Solution {public: vector<int> plusOne(vector<int>& digits) { //从末尾开始遍历,直到首位 for(int i = digits.size()-1; i >= 0; i--) { //先加一 digits[i]++; //如果加一后等于10,说明要进位,将该原创 2021-03-15 21:42:57 · 49 阅读 · 0 评论 -
26. 删除排序数组中的重复项
26. 删除排序数组中的重复项//强调这种解法要求一定要是排序数组//解题思路:这里其实用到了数组删除元素的一个思想,就是通过限制可访问范围来达到删除数组中元素的目的,将非重复的元素交换到数组的左侧,限制访问范围就是删除//使用双指针,两个指针从相同位置处开始,如果两个指针指向元素的值不相等,就将快指针的值与慢指针后面一个元素的值做交换class Solution {public: int removeDuplicates(vector<int>& nums) {原创 2021-03-15 21:13:17 · 64 阅读 · 0 评论 -
11. 盛最多水的容器
11. 盛最多水的容器//使用双指针,左右各一个指针,class Solution {public: int maxArea(vector<int>& height) { //左右指针 int left = 0; int right = height.size() - 1; //用于保存容器最大值的变量result int result = 0; //移动左右指针原创 2021-03-15 20:45:38 · 53 阅读 · 0 评论 -
leetcode拓展题1
leetcode拓展题1题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使他们的和正好为S,如果有多对数字的和为S,则输出两个数的乘积最小的(或最大)//假设输出乘积最小的一组class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { if(nums.size() < 2) return vector<int>();原创 2021-02-27 10:28:51 · 59 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历
二叉树的前序、中序、后序遍历/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: /** * * @param root TreeNode类 the root of binary tree * @return int整型vector<vector<>&原创 2021-01-22 17:42:00 · 68 阅读 · 0 评论