今天的每日一题
343.整数拆分
第一眼看到,我就想到了昨天做过的一个用双指针的题,对于343,我的想法是,左右各一个int指针pi,pj,然后左指针右移一位,右指针就左移一位,对于每个指针状态,再递归的求解。递归终止的条件是j = i+1,因为原来的时候乘积是xy,变化指针一下之后是(x+1)(y-1),令两式相等得到应该满足y=x+1.但是运行完了发现不对,这个情况下n=x+y=2*x+1恒为奇数,没有办法处理偶数的情况。我虽然不知道偶数具体怎么进行性判断,但是感觉奇数这种处理应该没什么问题。看了下题解,没有找到跟我差不多想法的。
刚刚开始做栈,还没复习到动态规划,没看题解都没有想到这是动态规划问题。后来想了一下,发现这个题有很明显的重叠子问题,n可以拆分为两个成绩最大的整数,拆出来的整数也都是有着固定的,最大拆分方案,所以最基本的dp方法就是建立dp数组,dp[i]代表的就是整数i可以拆成的乘积最大的整数,的乘积(说的有点别扭,但是最后要的是最大的拆分乘积,所以直接存储乘积即可,最后函数返回dpn就行)。但是这种基础动态规划,时间复杂度n方,空间是n,太慢了。
题解还给了两个个很dio的利用数学方法的题解,能优化动态规划,这个感觉就是个数学题,看我都看了很长时间,更不用想着能写出来了,感觉普适性不是很高,看完了除了觉得很牛逼什么也没学到,只是觉得大佬强。(O1)链接,比官方那个优化动态规划的On还dio
https://leetcode-cn.com/problems/integer-break/solution/343-zheng-shu-chai-fen-tan-xin-by-jyd/
class Solution {
public int integerBreak(int n) {
if(n <= 3) return n - 1;
int a = n / 3, b = n % 3;
if(b == 0) return (int)Math.pow(3, a);
if(b == 1) return (int)Math.pow(3, a - 1) * 4;
return (int)Math.pow(3, a) * 2;
}
}
1441.用栈来实现数组
这题挺垃圾的,跟栈也不知道有啥关系,题干说的模模糊糊,思想却很简单,唯一的收获时发现了一个有趣的问题
我和一个题解只是if和else的判断顺序不一样,但是他的速度比我快多了,我觉得
1.可能是给出的测试用例大多数都是要既push又pop的(即target总是比数组对应元素要大,需要跳过几个数组元素),按我的写法,总是要先判断是否相等,然后发现不相等再去判断是否小于,就耽误了时间。而他的题解先判断是否小于,很多情况下就直接走进小于的分支了,省了时间。
2.可能和电脑或者服务器啥的有关系,咱也不懂
735.行星碰撞
官方的题解里用到了collision,不懂,等有时间查一下,我自己写的正好会输出相反答案。难搞。不想做了
我的垃圾
import java.util.Stack;
public class Solution1 { //还存在问题,待解决,还有collision怎么用的问题
public int[] asteroidCollision(int[] asteroids) {
Stack<Integer> stack = new Stack<>();
stack.push(asteroids[0]);
int top = stack.peek();
for(int i = 1;i<asteroids.length;i++)
{
while (!stack.isEmpty() && asteroids[i] < 0 && 0 < stack.peek())
{
if(top>-asteroids[i]) {
}else if(top==-asteroids[i]){
stack.pop();
}else if(top<-asteroids[i])
{
stack.pop();
continue;
}
}stack.push(asteroids[i]);
}
int[] ans = new int[stack.size()];
for (int t = ans.length - 1; t >= 0; --t) {
ans[t] = stack.pop();
}
return ans;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
官方给出的答案
class Solution {
public int[] asteroidCollision(int[] asteroids) {
Stack<Integer> stack = new Stack();
for (int ast: asteroids) {
collision: {
while (!stack.isEmpty() && ast < 0 && 0 < stack.peek()) {
if (stack.peek() < -ast) {
stack.pop();
continue;
} else if (stack.peek() == -ast) {
stack.pop();
}
break collision;
}
stack.push(ast);
}
}
int[] ans = new int[stack.size()];
for (int t = ans.length - 1; t >= 0; --t) {
ans[t] = stack.pop();
}
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/asteroid-collision/solution/xing-xing-peng-zhuang-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。