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