
算法学习
文章平均质量分 85
fffffer
这个作者很懒,什么都没留下…
展开
-
剑指offer-把数字翻译为字符串(leetcode)
这道题可以看作是动态规划类的题目,类似于跳台阶的题目。例如:12258状态转移方程:dp[i] = dp[i+1] + dp[i+2]class Solution {public: int translateNum(int num) { string str = to_string(num); vector<int> nums(str.length()); int count = 0; int length原创 2020-06-27 18:37:19 · 203 阅读 · 0 评论 -
剑指offer-数字序列中的某一位(leetcode)
又是一道找规律的题目,头大得很。为了方便10 - n 位的规律,我们默认n >= 10,其他情况只要renturn n; 就可以了。原创 2020-06-27 18:32:30 · 235 阅读 · 0 评论 -
剑指offer-数组中出现次数最多的数字
常规算法不就说了,这次看到大佬的题解,特地记录以下。解法名称为:摩尔投票法假设出现次数最多的数字为 x,当nums[i] == x 时,votes += 1,否则 votes -= 1由此我们可以知道,遍历完数组后,votes > 0因此若数组中前m个数的和为0,那么后(n-m)个数的和仍大于0,出现次数最多的数字仍为 xclass Solution {public: int majorityElement(vector<int>& nums) {原创 2020-06-23 13:19:37 · 395 阅读 · 0 评论 -
剑指offer-剪绳子(leetcode)
这是一道动态规划的题目,如果看不出出来的话,可以模拟该题的过程。状态转移方程:dp[i] = max( dp[i] * dp[i-j], i * (j-i) )但是我们可以通过进一步观察当 n > 4 的时候,(i-j)< dp[i-j],同时在分割绳子的时候作为被分割出来的绳子长度 <= 3 的时候不应该进一步分割,而是选择不分割。所以当 n > 3 的时候,状态转移方程为dp[i] = max( dp[i], dp[i]*dp[i-j] );说的可能有点绕,建议.原创 2020-06-18 23:43:51 · 199 阅读 · 0 评论 -
剑指offer-机器人的运动范围(leetcode)
这道题目可以使用回溯的方法来做,但是想来想去应该有更加简洁的算法,即如下想法:因为机器人的可达路径总是由左至右或者由上至下的方式到达,也就是说,一个地点是否可达,不仅取决于自身坐标是否符合要求,而且其左边或者上边的地点也要可达,从而可以得到以下结论:visit[i][j] = visit[i-1][j] | visit[i][j-1]; 但是在具体写代码的时候要注意到边界问题。class Solution {public: int movingCount(int m, int n, i.原创 2020-06-18 21:06:42 · 179 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字(leetcode)
这道题目用到了二分查找的思想。nums[middle] >nums[end] :可以确定最小数字在(middle+1,end)这个区间nums[middle] < nums[end] :可以确定最小数字在(start, middle)这个区间nums[middle] == nums[end] :这个情况比较特殊,不能确定最小数字在左边区间还是右边区间。举一个特殊例子: 1,0,1,1...原创 2020-06-17 22:10:47 · 192 阅读 · 0 评论 -
剑指offer-青蛙跳台阶(leetcode)
因为小青蛙一次只能跳1/2个台阶,因此如果要跳到第n个台阶,只能从n-1或者n-2台阶跳上去。典型的斐波那契数列,只不过第0项也为1,只有这点区别。class Solution {public: int numWays(int n) { if(n < 2){ return 1; } int fib_N = 0,fib_O = 1,fib_T = 1; for(int i = 2;i <= n原创 2020-06-17 16:52:40 · 169 阅读 · 0 评论 -
剑指offer-用两个栈实现队列(leetcode)
这道题目的思路很简单:将输入的数据压入s1中,再将s1中的数据压入s2中,这样s2的出栈顺序就和队列的出队顺序一致。但是在判断出栈的时候要先判断s2是否为空,再判断s1是否为空。若两者都为空,则输出-1若s2不为空,则返回栈顶元素若s2为空 && s1不为空,将s1中的元素压入s2中,再返回s2的栈顶元素class CQueue { stack<int> s1; stack<int> s2;public: CQueue(原创 2020-06-17 14:44:28 · 116 阅读 · 0 评论 -
剑指offer-二维数组中的查找(leetcode)
这道题的解法核心就是:从右上角不断搜索。若 matrix[row][col]==target 则return true;若 matrix[row][col] >target,则向该数字的左方继续搜索,即col--;若matrix[row][col] <target,则向该数字的下方继续搜索,即row++;这样子做的原因是数组的每行每列都是有序的,这样子可以很容易的缩小查找范围。当然也可以使用二分法继续加快速的。class Solution {public: ...原创 2020-06-16 15:26:21 · 161 阅读 · 0 评论 -
剑指offer-数组中重复的数字(leetcode)
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。简单来说就是找到并返回数组中任意一个重复的数字。一共有三种思路可以解决这个问题:(1)把数组进行排序,遍历数组进行查找。(2)开辟一个额外的数组,进行比对。(3)在原数组上进行原地交换,把数组中的元素交换到其对应下表上。由于每个数字最多交换2次就可以到达他的位置,因此原创 2020-06-15 16:31:47 · 173 阅读 · 0 评论 -
leetcode 46. 全排列
dfs 的应用这道题我们依旧可以通过使用 dfs 的思想,也就是回溯的方法来做。举个例子:1,2,3的全排列为[1,2,3],[1,3,2][2,1,3],[2,3,1][3,1,2],[3,2,1]通过观察我们可以看出,以 1 开头的全排列实际上就是,[ 1,[2,3] 的全排列 ] ===> [1,2,3]、[1,2,3],通过这种方法我们可以很容易想到以 1 开头...原创 2020-03-04 16:12:35 · 110 阅读 · 0 评论 -
leetcode 40. 组合总和 II
这两天偷懒了,没有写题解=.=dfs 模板题虽说是模板题,还是要理解具体思想。因为题目中说到,每个元素不能重复利用,并且 candidates 可能有重复元素,所以我们要先把 candidates 进行排序。接下来就是深搜的过程了,由于每次搜索都是建立在上次搜索的结果之上,如果candidates[i] + sum <=target 那么就进行下一次搜索,并且把 candidate...原创 2020-03-04 15:02:52 · 135 阅读 · 0 评论 -
leetcode 61. 旋转链表
链表的应用乍一看这道题很麻烦,不过当我们仔细观察后可以发现,不论 k取何值,旋转的次数实际为 k % len ,len 为链表的长度。因此这道题的任务就是找到倒数第 k 个数据,使倒数第 k-1 个数据的next 指向 NULL,最后使链表最后一个数据的next指向head。/** * Definition for singly-linked list. * struct List...原创 2020-02-29 18:31:13 · 109 阅读 · 0 评论 -
leetcode 19. 删除链表的倒数第N个节点
依旧是链表的应用最开始看到这道题的时候,想法很暴力,遍历一遍得到长度,然后再遍历一遍删除指定元素。后来看来大佬的题解发现可以使用双指针的方法,只需要一次遍历就可以删除指定节点。需要注意的一点是,虽然题目中已经说明 n 是有效数字,但是依旧有可能出现 fast 指针为空的情况,即删除第一个元素的时候。这个时候只需要返回 head->next 就可以了,之后就可以愉快的写代码了!/...原创 2020-02-29 17:16:23 · 106 阅读 · 0 评论 -
leetcode 2. 两数相加
链表的应用题目的思路很简单,通过建立一条新的链表用来存放两数相加的结果。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* addTwoNumbers(struct ...原创 2020-02-29 16:47:52 · 108 阅读 · 0 评论 -
leetcode 70. 爬楼梯
感觉动态规划的前几道题有点水~_~申请一个一维数组dp,dp[i] 表示走到 i+1 层有多少种方式。一次只可以走一步或者两步,由此可以得到状态转移方程 dp[i]=dp[i-1]+dp[i-2]; 再做好数组初始化就可以很容易得到答案。int climbStairs(int n){ if(n < 3){ return n; }...原创 2020-02-28 18:09:24 · 174 阅读 · 0 评论 -
leetcode 64. 最小路径和
经典的动态规划题目因为只能通过向下或者向右走,不需要考虑对角等因素,而且要求的是最小路径和。因此,可以很容易得到状态转移方程grid[i][j]+=grid[i-1][j]<grid[i][j-1]?grid[i-1][j]:grid[i][j-1]; 在该题中我没有重新申请一个二位数组来存放路径和,而是直接在原数组上面做修改。得到状态转移方程后,只需要做好数组初始化...原创 2020-02-28 18:31:57 · 145 阅读 · 0 评论 -
leetcode 62.不同路径
经典的动态规划题目。因为机器人只能向右或者向下走,那么dp[i][j] =dp[i-1][j] +dp[i][j-1],dp[i][j]表示从起点到达 path[i][j] 的总路径和。状态转移方程就是dp[i][j] =dp[i-1][j] +dp[i][j-1]。int uniquePaths(int m, int n){ int dp[n][m]; mems...原创 2020-02-28 17:30:26 · 135 阅读 · 1 评论 -
leetcode 53.最大子序和
在遍历数组的时候,关键在于找到最大子序和的第一个数字。若当前访问的数字大于sum,那么必须要更新sum,即nums[i] > sum 的时候,更新sum,sum的含义为子序列nums[x...i]的和。最后更新ans。int maxSubArray(int* nums, int numsSize){ int ans = nums[0]; int sum = nums[0...原创 2020-02-28 17:00:13 · 98 阅读 · 0 评论 -
leetcode 20. 有效的括号
今天做了好多水题=_=简单说一下这个题吧,很经典的栈的应用。当输入字符是s[i]=='('||s[i]=='['||s[i]=='{'||top==-1 的时候,字符入栈,否则判断符号是否匹配。这个时候可以通过ASCII值来判断符号的匹配情况。bool isValid(char * s){ int len = strlen(s); if(len =...原创 2020-02-26 23:22:08 · 87 阅读 · 0 评论 -
leetcode 5. 最长回文子串
经典的动态规划题目。 由于回文序列的特殊性,可以很容易想到,如果字符串 s 是回文序列,那么如果我们在他的两端加入两个相同的字符后形成一个新的字符串 s_new 还是一个回文序列。当然,如果 s 不是回文序列,或者加入其两端的字符不相同,最后所得到的序列 s_new就不回文序列。 由此我们可以想到动态规划的状态转移方程 dp[i][j] = ( s[i] == ...原创 2020-02-26 22:47:05 · 75 阅读 · 0 评论 -
leetcode 14.最长公共前缀
一道水题,简单的说一下思路吧。通过使用双指针的方法,指针 i 指向公共前缀的末尾,指针 j 用来遍历所有字符串,直到遇到不同的字符结束比较,返回公共前缀。class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.size() == 0){...原创 2020-02-26 22:28:25 · 81 阅读 · 0 评论 -
hdu 2084 数塔(DP)
Problem Description在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗?Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表...原创 2018-10-15 16:30:15 · 153 阅读 · 0 评论 -
hdu 2018 母牛的故事(DP)
Problem Description有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。Output对于每个测试实例,输出在第n年的时候母...原创 2018-10-15 16:47:25 · 129 阅读 · 0 评论 -
hdu 2044 一只小蜜蜂…(DP)
Problem Description有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中,蜂房的结构如下所示。Input输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。Output对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数...原创 2018-10-15 17:12:12 · 144 阅读 · 0 评论 -
Codeforces 429B B. Working out(DP)
B. Working out time limit p...原创 2018-10-15 19:04:40 · 177 阅读 · 0 评论 -
zoj 3747 Attack on Titans(DP)
Attack on TitansTime Limit: 2 Seconds Memory Limit: 65536 KB Over centuries ago, mankind faced a new enemy, the...原创 2018-10-16 21:07:42 · 184 阅读 · 0 评论 -
hdu-4489-The King’s Ups and Downs(DP)
Problem DescriptionThe king has guards of all different heights. Rather than line them up in increasing or decreasing height ...原创 2018-10-17 18:25:30 · 211 阅读 · 0 评论 -
Notepad++选中行操作 快捷键 使用技巧
用Notepad++写代码,要是有一些重复的代码想copy一下,还真不容易,又得动用鼠标,巨烦人。。。。有木有简单的方法呢,确实还是有的不过也不算太好用。主要是应用键盘上的 Home ...转载 2019-07-12 20:31:41 · 1420 阅读 · 0 评论 -
ACM-动态规划专题总结
转载请注明出处,谢谢。 http://blog.youkuaiyun.com/cc_again?viewmode=list ———- Accagain 2014年5月15日动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力、建模抽象能力、灵活度。本人动态规划博客地址:http://blog.youkuaiyun.com/cc_aga...转载 2018-10-15 15:59:04 · 319 阅读 · 0 评论