1、排列硬币
//你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 // // 给定一个数字 n,找出可形成完整阶梯行的总行数。 // // n 是一个非负整数,并且在32位有符号整型的范围内。 // // 示例 1: // // //n = 5 // //硬币可排列成以下几行: //¤ //¤ ¤ //¤ ¤ // //因为第三行不完整,所以返回2. // // // 示例 2: // // //n = 8 // //硬币可排列成以下几行: //¤ //¤ ¤ //¤ ¤ ¤ //¤ ¤ // //因为第四行不完整,所以返回3. // // Related Topics 数学 二分查找
public int arrangeCoins(int n) {
long low = 1;
long high = n;
while(low <= high){
long mid = low + (high - low) / 2;
long sum = mid * (mid + 1) / 2;
if(sum == n){
return (int)mid;
}else if(sum < n){
low = mid + 1;
}else{
high = mid - 1;
}
}
return (int)high;
}
2、寻找比目标大的最小字母
//给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。 // // 在比较时,字母是依序循环出现的。举个例子: // // // 如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a' // // // // // 示例: // // 输入: //letters = ["c", "f", "j"] //target = "a" //输出: "c" // //输入: //letters = ["c", "f", "j"] //target = "c" //输出: "f" // //输入: //letters = ["c", "f", "j"] //target = "d" //输出: "f" // //输入: //letters = ["c", "f", "j"] //target = "g" //输出: "j" // //输入: //letters = ["c", "f", "j"] //target = "j" //输出: "c" // //输入: //letters = ["c", "f", "j"] //target = "k" //输出: "c" // // // // // 提示: // // // letters长度范围在[2, 10000]区间内。 // letters 仅由小写字母组成,最少包含两个不同的字母。 // 目标字母target 是一个小写字母。 // // Related Topics 二分查找
public char nextGreatestLetter(char[] letters, char target) {
int low = 0;
int high = letters.length-1;
if(target >= letters[high]){
return letters[0];
}
int mid = 0;
while(low<high){
mid = low + (high-low)/2;
if(letters[mid] > target){
high = mid;
}else {
low = mid+1;
}
}
return letters[low];
}