leetcode刷题笔记 7/12 二分查找专题
Question 1(leetcode:704):
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
思想:这题就是采用二分查找降低复杂度。因为是有序的。
public int research(int []nums,int begin,int end,int target)
{
int center=(begin+end)/2;
while(begin-end==-1||begin-end==0){
if(nums[begin]==target)return begin;
if(nums[end]==target)return end;
return -1;
}
if(nums[center]>target)
{
return research(nums,begin,center,target);
}
if(nums[center]<target)
{
return research(nums,center,end,target);
}
return center;
}
我感觉最后的判断有点冗余,但不知道如何。查看答案有了改进。发现因为center数已经判断为false,所以下一次递归应该不包括center.
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了99.55%的用户
Question2(leetcode:278):
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API .
思路:运用二分查找来进行迭代。
哎,运行总超时,但发现和官方答案一样,可惜可惜。经过调试发现center=begin+(end-begin)/2,这样修改防止计算溢出。
Question3:(leetcode 55)
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标
思考:这题归为动态规划,不过我首先运用贪心算法来进行求解。
public boolean explore(int[] nums,int begin,int end)
{
if(end>=nums.length)
{
return true;
}
int large=end-1;
for(int i=begin;i<end;i++)
{
if(i+nums[i]>large)
large=i+nums[i];
}
if(large==end-1)return false;
begin=end;
end=large+1;
return explore(nums,begin,end);
}
执行用时:2 ms, 在所有 Java 提交中击败了92.14%的用户
内存消耗:40.4 MB, 在所有 Java 提交中击败了21.27%的用户
总结:因为使用了递归,所以在空间上明显较大,运用空间换时间。