https://leetcode.com/problems/house-robber-iii/
题意
还是专业劫匪打劫,不能抢相邻的房子,但是这次房子的结构不再是线性而是一个二叉树了。解法
开始想着把二叉树先展开,发现不行。后来想到用递归来实现,递归的思路就比较简单了,大致上就是打劫当前结点所得加上打劫左右子树的左右子树的结果相加与打劫当前结点左右子树结果相加取大的那个。先完后发现代码好少,但是提交后时间非常长,因为递归每次都会去计算,随着层次变深,结点的遍历次数也在递增,加上缓存后时间缩小到原来的百分之一。
class Solution {
HashMap<TreeNode...
https://leetcode.com/problems/house-robber-ii/submissions/
题意
与198基本一样,专业劫匪去打劫一排房子,由于打劫相邻的房子会触发警报,因此只能打劫不相邻的房子,并且房子围成了圈,所以不能同时打劫首尾的房子,求能打劫的最大钱数。解法
动态规划,很容易得到动态方程dp[i] = Math.max(nums[i] + dp[i-2], dp[i-1]),即当前位置最大钱为打劫到前两栋加上当前的钱与打劫到前一栋的最大值,由于是i-2,因此dp数组大小定义为nums.length+2。
由于首尾的房子不能同时打劫,因此分开计算不包含第一...
https://leetcode.com/problems/house-robber/
题意
专业劫匪去打劫一排房子,由于打劫相邻的房子会触发警报,因此只能打劫不相邻的房子,求能打劫的最大钱数解法
动态规划,很容易得到动态方程dp[i] = Math.max(nums[i] + dp[i-2], dp[i-1]),即当前位置最大钱为打劫到前两栋加上当前的钱与打劫到前一栋的最大值,由于是i-2,因此dp数组大小定义为nums.length+2class Solution {
public int rob(int[] nums) {
int dp[] = new int[nu...
https://leetcode.com/problems/reverse-bits/
题意
整数按位翻转解法
由于限制位数为32位,所以只需对待处理的整数n进行32次右移位,每当低位&1的结果为1,说明低位为1,此时将待输出的目标整数(默认值为0)左移动一位并加上1;每当低位&1的结果为0,说明低位为0,此时将待输出的目标整数左移一位即可;循环直到移动完32次,所得目标整数即为所求。https://blog.csdn.net/pistolove/article/details/46868017
class Solution {
public int rev...
https://leetcode.com/problems/largest-number/
题意
求int数组拼接的最大值解法
先转成String,然后排序。排序里先按位比较,当2个数字开头相等但长度不等,则比较这两个数字拼接结果```javaclass Solution { public String largestNumber(int[] nums) {
List<String> ns = Arrays.stream(nums).mapToObj(new IntFunction<String>() {
@Override
publ...
https://leetcode.com/problems/dungeon-game/
题意
勇士从迷宫的左上角走到右下角去救公主,路上每次房间有怪物(扣血)或者血瓶(加血),勇士的血量必须大于0,否则的GG了。求勇士出发时的最小血量思路
开始想用dfs做,但是需要遍历所有情况,时间复杂度为O($c^r$),即使做出来也肯定是TLE。觉得应该是用动态规划做,但是想的从左上角开始规划,一直没想出来。后来了看了网上的解法,从公主位置开始规划,就简单很多。下面说下思路
公主房间的血量为max(1, 1- dungeon[row-1][column-1]),因为公主房间是最后一个,此时血量为...
https://leetcode.com/problems/majority-element/
题意
找出一个无序数列中占多数的数解法
排序后(n/2位置即结果)位置即结果
https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm
class Solution {
public int majorityElement(int[] nums) {
//Boyer Moore Voting Algorithm
int count = 0, candidate...
https://leetcode.com/problems/fraction-to-recurring-decimal/
题意
除法,用()来表示重复部分解法
计算整数部分,计下商和余数
假定余数不为0,则余数*10,将余数和位置加入map中用于判断余数是否重复,并将商加入小数部分
重复2,直至余数重复
在分数部分中第一个重复位置插入(class Solution {
//考虑到-2147483648的情况,不能直接abs
public String fractionToDecimal(int numerator, int denominator) {
StringBu...
https://leetcode.com/problems/maximum-product-subarray/
题意
求一个数组中子序列的最大乘积解法
暴力求解,复杂度O($ n^2$)
动态规划:由于负负得正,因此需要定义一个dp[n][2],其中dp[i][0]用来记录到i位置时的最小乘积,dp[i][1]记录到i到的最大乘积,得到如下动态转移方程,时间复杂度为O(n),提交后发现排名非常靠后,肯定有更好的解法dp[i][0] = Math.min(Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i])...
题意
计算逆波兰法表示的算式解法
遇到数字存入栈,遇到符号则出栈两个数字,并将结果入栈
class Solution {
Stack<Integer> integers = new Stack<>();
public int evalRPN(String[] tokens) {
for(String token: tokens) {
if ("+".equals(token)) {
int n2 = integers.pop(), n1 = integers.pop();
...