摘要:
思路:利用逻辑符的短路性质设置递归边界。 剑指 Offer 64. 求1+2+…+n class Solution { int res = 0; public int sumNums(int n) { boolean x = n > 1 && sumNums(n-1) > 0; res += n; 阅读全文
摘要:
1.状态定义 dp[i]表示前i日的最大利润 2.状态转移方程 前i日最大利润=max(前(i−1)日最大利润,第i日价格−前i日最低价格) dp[i]=max(dp[i−1],prices[i]−min(prices[0:i])) 剑指 Offer 63. 股票的最大利润 class Soluti 阅读全文
摘要:
讲真的,现在的心情难以言表。 约瑟夫环一般是用循环链表做的,以前也写过。但是DP的做法太骚了。 1.表示状态f(n,m)=y表示:n个数,每次数m个,最后留下的数的下标为y。 2.状态转移方程 f(n,m)=(m+f(n-1,m))%n 怎么来的呢? 假设f(n-1,m)=x,即从index=0开始 阅读全文
摘要:
思路: 1.除了大小王,有重复的牌无法组成顺子 2.最大牌与最小牌的差 >=5,无法组成顺子 剑指 Offer 61. 扑克牌中的顺子 class Solution { public boolean isStraight(int[] nums) { Set<Integer> set = new Ha 阅读全文
摘要:
dp三步走: 1.表示状态 dp[i][j]表示掷i个骰子,点数之和为j的概率。 2.状态转移方程 递推公式dp[i][j]=dp[i-1][j-1]+……+dp[i-1][j-6] i个骰子和为j的概率 = i-1个骰子和为j-1 * 最后一个骰子掷出1的概率 +……+ i-1个骰子和为j-6 * 阅读全文
摘要:
前言 在研究java集合源码的时候,发现了一个很少用但是很有趣的点:Queue以及Deque,平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用,但是一直都不知道Queue的作用,于是就直接官方文档好了。 正文 概念 从上图看出,Queue以及Deque都是继 阅读全文
摘要:
和上一道题差不多的思想,利用辅助双端队列队首存储最值。 剑指 Offer 59 - II. 队列的最大值 class MaxQueue { Deque<Integer> A; Deque<Integer> B; public MaxQueue() { A = new LinkedList<>(); 阅读全文
摘要:
类似第30题的单调栈,本题用单调队列可以进行优化。 剑指 Offer 59 - I. 滑动窗口的最大值 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0 || k == 0) 阅读全文
摘要:
思路:使用辅助栈。 栈A实现正常的push,pop,top函数。 栈B在每次栈Apush的时候判断,栈顶元素是否>=要push进栈A的元素。 注意的点: 1. if(B.empty() || B.peek() >= x) 此处必须要>=,因为在>情况下,push(0),push(0),pop(),栈 阅读全文
摘要:
水一道题…… 留意substring(n)是截取下标为n到最后一个元素。 substring(0,n)是截取下标为0到下标为n-1的元素。 剑指 Offer 58 - II. 左旋转字符串 class Solution { public String reverseLeftWords(String 阅读全文
摘要:
思路:双指针从后往前遍历,根据第一个遇到的空格划分单词,使用StringBuilder拼接。 贴一下从后往前最后一个单词怎么拼接: 1.如果首位为字母,while(i >= 0 && s.charAt(i) != ' '),i为-1时进行拼接然后跳出大循环。 2.如果首位为空格,也类似,只是不用拼接 阅读全文