ACM算法刷题
猪猪传奇
真正的大师,永远怀着一颗学徒的心
展开
-
【 leetcode Top 100】64. 最小路径和
题目:思路:思路很简单,只要涉及到状态的,无非就那么几种方法:深搜,广搜,动态规划。这里求最小值,用动态规划最好,时间最低如果用深搜广搜则会超时,在这道题目中深搜广搜的复杂度都是一样的。也就是会枚举所有到达终点的状态,如果需要剪枝操作,也是维护一个当前最小cost的数组,当大于这个cost的时候,就丢弃当前状态。如果不使用剪枝,是超时的,使用了剪枝才将将AC。运行结果:代码:动态规划,还是状态转移问题,动态规划最好的一点是,状态数组里面保存的始终是最优的,这样下次转移的时候也是最优的。一直原创 2021-09-23 19:34:43 · 502 阅读 · 1 评论 -
【 leetcode Top 100】62. 不同路径
题目:思路:思路有俩:一个是动态规划,一个是数学直接算数学:可以根据m,n直接算出来,需要走多少步向右,走多少步向左,然后就是有多少种组合的问题。动态规划:动态规划的思想比较简单,因为动态规划问题,就是状态的转移问题,考虑当前状态,当前状态表示,走到当前表格需要走的步数,而当前状态依赖于之前的状态,当前状态可以由左面的格子 + 上面的格子得出。动态规划问题,只需要考虑两个方面:状态的转移,状态数组的初始化。数学解法:class Solution {public: int uni原创 2021-09-23 18:29:51 · 299 阅读 · 1 评论 -
【 leetcode Top 100】56. 合并区间
题目:思路:这个思路,就是排序,然后排序后合并,很简单的思路,但是之所以写这篇博客,是因为发现了sort用户自定义函数的局限,小数据量的时候,可以运行,但是当大数据量的时候,它报错,,,不知道为什么。然后还有一点,就是带入用户自定义函数的时候,要将cmp声明为static函数,或者写在类外,不能作为成员函数出现,因为成员函数有一个隐式的this指针,这与sort中的cmp参数不匹配,会报错。正确的代码:因为sort默认就是字典序升序排序class Solution {public: v原创 2021-09-23 17:46:05 · 136 阅读 · 0 评论 -
【 leetcode Top 100】55. 跳跃游戏
题目:代码:class Solution {public: bool canJump(vector<int>& nums) { if(nums.size()<=0)return false; int index = 0; for(int i=0;i<nums.size();i++){ if(index < i) return false; if(index &原创 2021-09-23 17:26:34 · 97 阅读 · 0 评论 -
【 leetcode Top 100】32. 最长有效括号
题目代码:class Solution {public: stack<int> stk; int longestValidParentheses(string s) { if(s.size()==0)return 0; int Max = 0; for(int i=0;i<s.size();i++){ switch(s[i]){ case '(':原创 2021-09-14 18:19:35 · 111 阅读 · 0 评论 -
【 leetcode Top 100】22. 括号生成
题目:思想:这个思想还是类似于递归的思想,但是这个递归的思想很不好想,在递归状态的时候,不是每次递归都可以填写多个“(” ,如果是可以填写多个的话,就会造成很多次的状态重复。总之这样想就太麻烦了,如果每次递归都可以填写多个“(”,那么按理来说它也可以填写多个“)”,最后再一组合情况,就需要二重循环了,那就太麻烦了,并且递归过程中重复状态就太多了。最简单的情况就是每个递归只管一个“(” 或 “)”的添加与否,这样反而会减少递归次数,并且思路也更加简单。注意:注意,当前状态的字符串,“)”的个数一定原创 2021-09-11 15:16:19 · 102 阅读 · 0 评论 -
【 leetcode Top 100】19. 删除链表的倒数第 N 个结点
题目:思想:两次遍历:第一次遍历得到总长度,第二次遍历删除节点递归:递归到链表最后,等回退的时候,删除节点双指针:一次遍历,O(2n),推荐注意:本题中需要注意的点,就是一个删除的节点是第一个节点的时候,需要额外判断一下。递归:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), n原创 2021-09-11 13:15:36 · 94 阅读 · 0 评论 -
【 leetcode Top 100】17. 电话号码的字母组合
题目:这个题目有两个思想:循环与递归我首推递归思想,简单明了。递归的思想:递归的思想就是一次成完整的串,成完整的串之后,加入res,然后递归回溯,再构成其他的串。主要还是循环和递归地结合,核心是一次就得到最终结果的一部分。class Solution {public: void dfs(vector<string>& res, string& digits,int index, string tmp_s,原创 2021-09-10 21:21:05 · 84 阅读 · 0 评论 -
【 leetcode Top 100】11. 盛最多水的容器
题目:这道题,说实话,打死我,我也想不到双指针做法,我只是觉得双for,肯定会超时,肯定有简单做法,但是万万没想到啊,还有这种操作。代码:class Solution {public: int maxArea(vector<int>& height) { int i=0;int j=height.size()-1; int maxA = 0; while(i<j){ maxA=max(maxA原创 2021-09-04 17:21:58 · 137 阅读 · 0 评论 -
【 剑指offer 】JZ27 字符串的排列
思想:其实这个思想,我也不知道是不是动态规划的思想,因为,感觉这就是正常思维,保存当前字符之前的所有可能字符串,即当前字符为i,那么就要保存前i-1个字符形成的所有排列,然后将当前字符一次插入到这些排列中的每一个位置,然后形成新的排列。class Solution {public: vector<string> Permutation(string str) { vector<string> res; string tmp=""; .原创 2021-07-22 14:27:59 · 97 阅读 · 0 评论 -
【 剑指offer 】JZ46 child 们的游戏(圆圈中最后剩下的数)【垃圾CSDN,连child的中文名都不让说】
前言:这是一个约瑟夫环的问题,主要解决思想有两个,第一个是模拟过程,第二个是经典的解法。参考文档:约瑟夫环问题题目:题目如下:1. 傻瓜解法傻瓜解法就是模拟约瑟夫环的过程,因为约瑟夫环涉及到删除元素,故使用vector来实现。代码:class Solution {public: int LastRemaining_Solution(int n, int m) { if(n==0)return -1; vector<int> tmp(n)原创 2021-07-07 13:44:40 · 144 阅读 · 2 评论 -
【 剑指offer 】JZ40 数组中只出现一次的两个数字
class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector */ vector<int> FindNumsAppearOnce(vector<int>& array) { // write code..原创 2021-07-03 20:47:00 · 141 阅读 · 0 评论 -
【剑指offer】整数中1出现的次数
前言这道题目,我做了一个小时,说实话,挺简单的,但是我一开始没有悟透,全是自己想出来的,就很麻烦,从一开始的毫无头绪,到后来的悟透了,这个过程实在是太难了。。好了,如图所示,需要计算出一个十进制数中的1的个数,注意这是一个范围性概念,是从1~n中所有的数所包含的全部的1 。代码先贴一下代码吧,挺抽象的。class Solution {public: int NumberOf1Between1AndN_Solution(int n) { vector<int>原创 2021-06-28 00:26:18 · 135 阅读 · 1 评论 -
【LeetCode刷题】82. 删除排序链表中的重复元素 II
题目描述:思路:这道题,还是很简单的,只需要维持一个重复数字的指示即可,之后遇到的就直接跳过。我的代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* deleteDuplicates(struct ListNode* head){ struct ListNode*原创 2021-04-07 19:43:47 · 177 阅读 · 0 评论 -
【LeetCode刷题】81. 搜索旋转排序数组 II
题目描述:这道题爆搜貌似不太行,然后有人想直接排序,再二分,然后复杂度就爆了。最终我还是看到一个神奇的二分算法,不过那个人是用C++实现的,我用C语言实现了一次bool search(int* nums, int numsSize, int target){ int low=0,high=numsSize-1; while(low<=high){ while(low<high&&nums[low]==nums[low+1])low++;原创 2021-04-07 19:05:12 · 109 阅读 · 0 评论