20200730笔记.343.1441.735(待解决)

今天的每日一题
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值