自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 凑单算法——0-1背包加一层循环

题目大意:你有一张满金额k可用得免单券,购物车里有n个东西。设计一个算法,选出若干件物品,使得总金额刚好大于等于k。输出总金额即可,如果有多个结果只用输出任意一个举例:数组n:[2,3,6,9,40,96],k=100。输出101([2,3,96]),不用输出具体的物品价值。方法一:深度搜索,这个就不详细讲了,复杂度爆炸。方法二:开始没想到~~~睡眠很重要,脑子不清醒,啥都想不到其实对于每个物品假设它的重量和价值相同就可以了。然后从把金额k当作背包的初始可承受重量,并每次加1枚举。

2020-10-30 19:52:50 23

原创 智力题_环回到原点问题

一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步回到0点有多少种不同的走法?举例:如果n=1,则出发只能到1或者9,不可能回到0,共0种走法。如果n=2,则从0出发有4条路径:0->1->0,0->1->2,0->9->8,0->9->0,其中有两条回到了0点,故有两种走法。思路:考虑用动态规划的思想,只可能从左边或者右边相邻点回到原点,即先到旁边的点,看看有多少回来的方法。所

2020-10-25 22:21:11 36

原创 二叉树的前中后序遍历的非递归解法

二叉树的前序遍历非递归解法:思路:需要借助于一个辅助栈。遍历每个节点时需要把其右子树节点放入到栈中,然后将当前结点的值存入结果中,然后递归遍历其左子树,如果左子树为空,则从栈中取出栈顶结点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), le

2020-10-19 11:31:55 6

原创 leetcode145——二叉树的后序遍历序列(非递归解法)

题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/submissions/思路:以栈的方式显示模拟/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), lef

2020-10-17 20:58:26 12

原创 leetcode54——螺旋矩阵

题目链接:思路:模拟打印,left维护初始打印列,right维护最后一列,top维护第一行,bottom维护最后一行。首先打印第一行全部元素,然后打印最后一个元素对应的所在列剩余元素m-1(m为当前打印的列的元素个数)。然后打印最后一行n-2元素(n为当前打印的第一行的元素个数),最后打印当前列剩余m-1个元素(当且仅当right>left&&top>bottom时才有第三步第四步的打印)。每轮打印完毕left++,right--,top++,bottom--cla

2020-10-17 20:15:01 15

原创 leetcode437——前缀和

题目链接:https://leetcode-cn.com/problems/path-sum-iii/思路:以map来记录路径上结点的前缀和,key代表着路径上的前缀和,val代表着当前结点路径上的前缀和的个数针对每个结点记录前缀和,并判断之前在路径上的前缀和cur_sum-target的个数,加上这个数,并将当前结点前缀和cur_sum加入到map中,使val加一。然后递归加上左右结点产生的值为target的路径个数。最后将当前结点前缀和对应val减一。/** * Defini

2020-10-12 15:46:28 10

原创 leetcode621——优先队列的思路

题目链接:https://leetcode-cn.com/problems/task-scheduler/思路:数量多的先安排任务,少的后安排,每次仅仅采用每类任务个数减1的方式class Solution {public: struct node { node():ch('.'),count(0){} node(char c,int n):ch(c),count(n) { } bool frien

2020-10-04 21:57:32 650

原创 leetcode448——巧用符号标注已出现数字

题目链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/思路:对于出现的数字将其标注为负数,if(nums[abs(nums[i])-1]>0)nums[abs(nums[i])-1]*=-1注意:1.因为可能本身该位数字已经为负数,只有加上abs才能找到正确置为负数的下标。2.本身值为负数代表该位数字已出现过,无需再乘以-1class Solution {public:

2020-09-25 21:27:28 17

原创 找出升序排序数组第一个小于目标值的所有下标,第一个大于目标值的所有下标——四次二分搜索

题目:找出升序排序数组第一个小于目标值的所有下标,第一个大于目标值的所有下标——四次二分搜索思路:1. 第一次二分:找目标值的最左下标2. 第二次二分:找小于目标值的第一个数的值的最左边界3. 第三次二分:找第一个大于目标值的下标4. 第四次二分:找第一个大于(第一个大于目标值的值)的下标例如:{-1,2,2,3,3,3,5,5,5,6,7,8,10}; //结果应该为 1,2,6,8#include <iostream>#include <cstdio..

2020-09-25 12:12:34 89

原创 leetcode34——两遍二分法

题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/第一遍找左边第一个目标值,第二遍找大于目标值的第一个值得位置class Solution {public:int findIndex(vector<int>& nums,int target,bool flag){ int len=nums.size.

2020-09-22 19:27:58 1233

原创 leetcode68——二叉树的最近公共祖先

题目链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/对于每个结点讨论四种情况:1.左子树不存在结点为nullptr,以 left来标记。右子树不存在结点为nullptr,以right来标记。那么返回nullptr。2.left和right均不为空,返回当前结点3.left为空,而right不会空,细分两种情况:一个结点在右子树,则right指向p或q,两个结点在右子树中,

2020-09-03 18:23:15 24

原创 leetcode84——柱状图的最大矩形

单调栈的方法,每次弹出大于等于当前需要入栈的元素,且最后的栈是顺序递增的,需要将所有元素依次弹出,这个时候每个弹出的元素所对应的最大面积为index=stk.top(),stk.pop(),result_max=max(result_max,(len-stk.top()-1)*heights[index])class Solution {public: int largestRectangleArea(vector<int>& heights) { int

2020-08-28 14:00:54 50

原创 leetcode647——回文字符串的中心扩展法

对于长度为n的字符串,只需遍历0-2*n-2,中心为left=n/2,right=n/2+1然后只用针对每个中心一层循环遍历,时间复杂度为O(n^2),就把奇数偶数情况统一起来了。class Solution {public: int countSubstrings(string s) { int len=s.size(); int result=0; for(int i=0;i<2*len-1;i++) {

2020-08-19 17:34:10 35

原创 C语言函数汇总

#include <iostream>#include <assert.h>#include <cstdio>using namespace std;unsigned int strlen_func(const char *ch){ unsigned int len=0; assert(ch!=NULL); while(*ch++!='\0') { len++; } return len;}c.

2020-08-14 15:34:25 33

原创 leetcode337——打家劫舍III

方法一:树上dp,通过两个unordered_map记录每个点选择获取或者不选择获取的状态。选择则状态转移方程为f[o]=o->val+g[o->left]+g[o->right]不选择点的状态为g[o]=max(f[o->left],g[o->left])+max(f[o->right],g[o->right])/** * Definition for a binary tree node. * struct TreeNode { *

2020-08-05 22:08:59 30

原创 Leetecode——面试题 16.25. LRU缓存

常考。最初建立头部尾部哑结点,两者相互指向。注意的是push时本身有key是应该对其进行更新,并将其移到头部。不然再根据是否容量足够来判断是否需要删除尾部结点,然后将其放置到头部哑结点后面一位。get时有对应结点需要将当前结点从结点位置移动到头部后一个结点。class LRUCache {private: int _capacity; int count_node=0; struct Node { Node(int _key,int _val)

2020-08-05 14:29:10 28

原创 leetcode470——用 Rand7() 实现 Rand10()

题目链接:https://leetcode-cn.com/problems/implement-rand10-using-rand7/思路:首先利用(rand7()-1)*7 随机生成等间隔的数据0,7,14,21,28,35,42然后利用rand7()在生成数据将数据插入到第一步生成的数据中,保证随机性。从而得到1,2,3,...,49对于大于40的数据重新生成,而对于小于的数据对十取模加一,这样保证了1-40之间数据的概率是完全相同的。// The rand7() API.

2020-08-02 17:32:05 45

原创 剑指 Offer 40. 最小的k个数

题目链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/思路:快速排序的变形方法一:class Solution {public: vector<int>result; int findNum(vector<int>& arr,int k,int left,int right) { int temp=arr[left]; while

2020-07-27 12:57:32 33

原创 leetcode 5474——好叶子节点对的数量

题目链接:https://leetcode-cn.com/problems/number-of-good-leaf-nodes-pairs/思路:做题时,想的是记录每个点的父节点来回溯找到每个节点的第一个公共祖先,这样的时间复杂度是O(n^2),太大了。可以考虑以空间换时间的方式,针对每个叶子结点记录一条路径。找两个结点的最低公共祖先,每两个的时间复杂度为O(n)/** * Definition for a binary tree node. * struct TreeNode {

2020-07-26 19:38:21 126

原创 leetcode42——接雨水

题目链接:https://leetcode-cn.com/problems/trapping-rain-water/思路:方法1:暴力(超时了)遍历每个下标,找左边和右边的最大值max_left,max_right,并取两者的最小值Min,将Min-height[j]和0的最大值加到result上即可class Solution {public: int trap(vector<int>& height) { int len=height.si

2020-07-24 17:57:44 31

原创 leetcode26——删除排序数组中的重复项

题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/方法一:只用erase:其返回值指向删除元素的第一个下标class Solution {public: int removeDuplicates(vector<int>& nums) { int len=nums.size(); if(len==0)return 0;

2020-07-22 13:19:37 31

原创 leetcode95——不同的二叉搜索树

题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/思路:首先从根节点进行分析,可能值为i,(1<=i<=n)。根据二叉搜索树的性质,左子树的值可能为1~i-1,右子树的值可能为i+1~n。然后依次递归下去,返回到当前层,则将左右子树的根结点串到当前结点就可以了。/** * Definition for a binary tree node. * struct TreeNode { * i

2020-07-22 10:35:33 33

原创 Leetcode524—— 通过删除字母匹配到字典里最长单词(双指针)

题目链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/思路:对数组每个字符串采用双指针判断class Solution {public: string findLongestWord(string s, vector<string>& d) { int s_len=s.size(); string result="";

2020-07-18 21:55:07 27

原创 Leetcode611——双指针问题

题目链接:https://leetcode-cn.com/problems/valid-triangle-number/solution/思路:先排序,然后对于每个下标为i的数字,将其作为第三条边,然后将第一个指针left=0,right=i-1,如果nums[left]+nums[right]>nums[i]则 result+=right-left,right--否则left++通过双指针的方式可以使时间复杂度降低至O(n^2)class Solution {publi.

2020-07-18 18:52:28 33

原创 Leetcode120——三角形的最小路径和

题目链接:https://leetcode-cn.com/problems/triangle/思路:动态规划,直接左对齐,当j==0时dp[i][j]=dp[i-1][j]+c[i][j]当j==i时dp[i][j]=dp[i-1][j-1]+c[i][j]其余情况dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+c[i][j]注意,这个三角形数字数目是每层数目加1,开始误以为三角形不规则。导致DFS做法超时还可以考虑将j反向遍历,将空间复杂度优化为O(

2020-07-14 19:33:11 33

原创 Leetcode面试题17.13

题目链接:https://leetcode-cn.com/problems/re-space-lcci/submissions/思路:字典树实现倒序查找+dpclass Solution {struct Tree{ bool flag; Tree* child[26]={nullptr}; Tree() { flag=false; }};public: int respace(vector<string>&

2020-07-10 17:08:48 43

原创 leetcode146——LRU(HashMap加双向链表!!!)

老是想的是deque,然而要想想双向链表的插入删除复杂度才为O(1)呀!!!题目连接:https://leetcode-cn.com/problems/lru-cache/struct BidirectionalNode{ BidirectionalNode* prev; BidirectionalNode* next; int key; int value; BidirectionalNode():key(0),value(0),prev(nullptr

2020-07-07 17:54:26 65 1

原创 特征提取——考map「pair「int,int」」,int」结合起来的用法

题目连接:https://www.nowcoder.com/questionTerminal/5afcf93c419a4aa793e9b325d01957e2可以用pair<int,int>来实现双键值,即通过比较pair.first,pair.second来判断相等性#include <iostream>#include <cstdio>#include <map>using namespace std;int main(){ i

2020-07-02 14:55:21 219

原创 Leetcode209——长度最小的子数组(双指针问题)

题目链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/思路:双指针首先两个指针同时指向0位,beg,last如果当前值之和大于等于s,则l循环减去nums[beg],beg++然后加上nums[last],last++class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int l

2020-06-28 22:43:02 36

原创 leetcode139——单词拆分(动态规划)

题目链接:https://leetcode-cn.com/problems/word-break/首先考虑到unordered_set是基于哈希表实现的,查询的时间复杂度为O(1)所以首先将wordDict中每个单词存到set中将dp[0]初始化为true;对于dp[i]可以考虑分解为两部分,dp[j]&&check(s[j...i-1])(0<=j<=i-1)check即是根据unordered_set来判断是否有等于s[j...i-1]的单词。cla

2020-06-26 15:26:23 61

原创 leetcode16——带绝对值的最接近三数之和

题目链接:https://leetcode-cn.com/problems/3sum-closest/solution/zui-jie-jin-de-san-shu-zhi-he-by-leetcode-solution/思路:借助双指针对枚举进行优化。如果pb,pc当前指向元素大于target,则将pc向左移动,因为以pc为第三个数的指针的pa,pb,pc已经指向最接近target的值。如果小于target,则将pb向右移动,因为以pb为第二个数指针的当前三指针已经达到最接近target。即如

2020-06-24 23:05:13 56

原创 剑指offer20题——leetcode主站65题

题目链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/思路:1. 首先去除字符串首尾字符2. 根据小写e划分指数和底数3. 分别对指数和底数判断是否合法即可class Solution {public: bool judgeDigit(string s) { int len=s.size(); bool flag_has_digit=fals

2020-06-19 21:34:05 40

原创 leetcode1014——最佳观光组合

题目链接:https://leetcode-cn.com/problems/best-sightseeing-pair/思路:不能采用两重循环暴力枚举,会超时,而应该将A[i]+A[j]+i-j拆分为两部分,A[i]+i,A[j]-j两部分(i<j)。这样单重循环枚举j,保留j之前的最大的A[i]+i,为max_i_part,然后每次取max_i_part+A[j]-j当前的最大值。class Solution {public: int maxScoreSightseeingP

2020-06-18 11:50:08 61

原创 Leetcode——只出现一次的字符

只出现一次的字符I:其余字符出现两次直接将全部数字异或得到结果。只出现一次的字符II:其余字符出现三次用seen_once=~seen_twice&(seen_once^num)用seen_twice=~seen_once&(seen_twice^num)来区分出现一次或三次,最后结果为出现一次。class Solution {public: int singleNumber(vector<int>& nums) { i

2020-06-16 09:14:18 49

原创 Leetcode1300—— 转变数组后最接近目标值的数组和

考点:双重二分函数:max_element(vec.begin(),vec.end())返回指向最大元素的迭代器lower_bound(vec.begin(),vec.end(),val)返回指向排好序数组的大于等于val的第一个元素的迭代器lower_bound(vec.begin(),vec.end(),val)返回指向排好序数组的大于val的第一个元素的迭代器class Solution {public: int findBestValue(vector<int&

2020-06-14 23:34:28 29

原创 Leetcode15——三数之和为0

伴随着第二个数递增时,第三个数递减,所以采用双指针:class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { int len=nums.size(); sort(nums.begin(),nums.end()); vector<vector<int>>result; for

2020-06-13 12:48:59 51

原创 leetcode990——并查集

class Solution {private: int fa[26];public: int DFS(int x) { if(fa[x]!=x) fa[x]=DFS(fa[x]); return fa[x]; } bool equationsPossible(vector<string>& equations) { int len=equations.size();.

2020-06-09 17:13:05 39

原创 Leetcode面试题9——根据前序和中序遍历序列来建立二叉树

/** * 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* constructTree(vector.

2020-06-07 13:51:24 54

原创 leetcode837——动态规划

获胜的概率只和下一轮开始前的得分有关,因此根据得分计算概率。令dp[x]表示从x开始游戏并获胜的概率,目的是求dp[0]的值。情况1:当K<=x<=Min(N,K-1+W)时dp[x]=1。当x>=Min(N,K-1+W)时dp[x]=0;情况2:当x<Kdp[x]=直观的动态规划解法:class Solution {public: double new21Game(int N, int K, int W) {

2020-06-03 15:37:30 42

原创 Leetcode66——对称二叉树

一个树为对称的仅当两棵子树互为镜像,即要满足:1.子树根节点值相等2.每个树的右子树都与另一个树的左子树镜像对称。有递归迭代两种解法:递归:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), righ

2020-05-31 17:19:16 50

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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