三数之和问题-力扣15
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
- 三层循环(不推荐)
- 利用左右指针+二分查找
思路:
- Arrays.sort(nums)方法对nums数组进行从小到大排序。
- 一层循环,代表第一个数,放双指针left ,right,用来二分查找
- 去重
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList();
//必不可能
if(nums==null || nums.length<3) return list;
//排序
Arrays.sort(nums);
//循环
for(int i=0;i<nums.length-2;i++){
//必不可能
if(nums[i]>0){
break;
}
//去重
if(i-1>=0 && nums[i]==nums[i-1]) {
continue;
}
int need = -nums[i];
int left = i+1,right=nums.length-1;
//双指针,二分查找
while(left<right){
int mid = nums[left]+nums[right];
if(mid<need){
left++;
}else if(mid>need){
right--;
}else{
//刚好
List<Integer> curr = new ArrayList();
curr.add(nums[i]);
curr.add(nums[left++]);
curr.add(nums[right--]);
list.add(curr);
//去重
while(left<right && nums[left]==nums[left-1]){
left++;
}
while(right>left && nums[right]==nums[right+1]){
right--;
}
}
}
}
return list;
}
}
小球问题
一个小球,从高为height的地方下落,下落弹地之后弹起高度为下落时的一半,如此往复,计算小球从height高度下落到第count次弹地往返的总路程,结果保证两位小数。
- 循环法
public static void main(String[] args) {
//获取输入数据
Scanner cin = new Scanner(System.in);
int height, count;
while(cin.hasNextInt())
{
height = cin.nextInt();
count = cin.nextInt();
System.out.println(solution(height,count));
}
}
public static String solution(int height, int count){
if(height <= 0 || count < 1){
//错误
System.out.println("参数错误!");
System.exit(0);
}
float length = height;
if(count == 1){
return String.format("%.2f", length);
}
for(int i = 1; i < count;i++){
//2<<(i-1) ---> 2的(i-1)次幂
length += 2 * height/((float)(2<<(i-1)));
}
return String.valueOf(String.format("%.2f", length));
}
- 递归法
public static void main(String[] args) {
//获取输入数据
Scanner cin = new Scanner(System.in);
int height, count;
while(cin.hasNextInt())
{
height = cin.nextInt();
count = cin.nextInt();
System.out.println(Float.valueOf(solution(height,count))-height);
}
}
public static String solution(float height, int count){
if(height <= 0 || count < 1){
//错误
System.out.println("参数错误!");
System.exit(0);
}
float length = height*2;
if(count == 1){
return String.format("%.2f", length);
}
length += Float.valueOf(solution( height/2,count-1));
return String.valueOf(String.format("%.2f", length));
}