lintcode算法笔记

lintcode算法题目笔记

254.丢鸡蛋

描述

楼有n层高,鸡蛋若从k层或以上扔,就会碎。从k层以下扔,就不会碎。

现在给两个鸡蛋,用最少的扔的次数找到k。返回最坏情况下次数。
说明
对于n=10, 一种找k的初级方法是从1、2…k层不断找。但最坏情况下要扔10次。

注意有两个鸡蛋可以使用,所以可以从4、7、9层扔。这样最坏就只需要4次(例如k=6时)。

样例
给出 n = 10, 返回 4.
给出 n = 100, 返回14.
笔记
一开始也没太读懂题目,或者说大概读懂了题意但一时想不到思路:鸡蛋打碎就没有了,所以不能用二分法,但一层一层的扔显然不是最优解,然后潜意识下多看了说明中的4,7,9两眼,好想看攻略
首先,把已知的条件列出来:楼层总数n,鸡蛋个数2,还有每个鸡蛋只能碎一次。

假设只有一颗鸡蛋的情况下,为了找出k必须从第一层开始一层一层的试;而当有了第二颗鸡蛋的时候,我们就可以用它为第一颗鸡蛋去掉一部分错误答案区间,重点则是如何取得最优解。

思路
通过“观察”很容易看出4,7,9是等差数列4,3,2的和组成的数列,不难想到,如果将第二颗鸡蛋从4,7,9层依次丢下,可以将第一颗鸡蛋需要逐层丢下的楼层区间分割成了(123),(56),(8),(10),设两个鸡蛋扔的次数分别为k1,k2,则k1+k2<=4。
根据题中所提到的这个思路我们可以反推,解题过程,后面的过程看不少人写过也不知具体出处就不写了,,
前面写了这么多其实代码出奇的简单,根本不用去扔鸡蛋


    public int dropEggs(int n) {
        // write your code here
        int a=1;
        double sum=0;
        while(sum<n){
            sum+=a;
            a++;
        }
        return a-1;
    }

56.两数之和

描述

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。

: 你可以假设只有一组答案。

样例
Example1:
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
Example2:
给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2].
思路
在相似的题目中最简单的一个,已经确定了必有两数之和等于target,两个循环嵌套,然后判断一下数组下标的大小即可,;


    public int[] twoSum(int[] numbers, int target) {
        // write your code here
        
        for (int i=0;i<numbers.length ;i++ ){
            for (int j=i+1;j<numbers.length ; j++) {
                if(target == numbers[i]+numbers[j]){
                   if(i>j){
                        return new int[]{j,i};
                   }else{
                        return new int[]{i,j};
                   }
                }
            }
        } 
        return new int[]{};
    }

(未完待续)
[1]: https://www.lintcode.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值