230217 力扣简704 二分查找 15号的每日一题
自己写的二分查找 很长时间不写代码了 都忘干净了
看完答案更改 附在下面了
发现并不需要重复递归调用 只需要更改标记头尾的值并且验证满足循环条件即可
在if语句里面写了多个return 但是嵌套调用会将代码返回到调用那块的标志点 所以是整个不对的
package est; //import java.util.Arrays; public class LeetcodeTest { public static void main(String []args) { System.out.println("test"); int[] nums = {1,2,3,4,5,6,7}; System.out.println(LeetcodeTest.search(nums,-1)); } public static int search(int[] nums, int target) { return LeetcodeTest.midsearch(nums, 0, nums.length-1, target); } public static int midsearch(int[] nums, int head, int tail,int target) { int mid = (head + tail)/2; // int mid = (head + tail)<<1; if(head>tail) { return -1; } if(nums[mid]==target) { return mid; } else if(nums[mid]>target) { tail = mid-1; LeetcodeTest.midsearch(nums,head,tail,target); } else if(nums[mid]<target) { head = mid+1; LeetcodeTest.midsearch(nums,head,tail,target); } return mid; } }

//并不需要重复递归调用 只需要更改标记头尾的值并且验证满足循环条件即可
//可以把取数组的第mid个值写成单独的一句,这样就没必要多次取值了
package est; //并不需要重复递归调用 只需要更改标记头尾的值并且验证满足循环条件即可 可以把取数组的第mid个值写成单独的一句,这样就没必要多次取值了
/*给定一个 n 个元素有序的(升序)整型数组 nums * 和一个目标值 target ,写一个函数搜索 nums 中的 target, * 如果目标值存在返回下标,否则返回 -1 */ public class LeetcodeTest { public static void main(String []args) { System.out.println("test"); int[] nums = {1,2,3,4,5,6,7}; System.out.println(LeetcodeTest.search(nums,0)); } public static int search(int[] nums, int target) { int head = 0; int tail = nums.length-1; int mid = 0; while(head<=tail) { mid = head+(tail-head)/2; //注意mid的设置 if(nums[mid] == target) { return mid; } else if(nums[mid] > target) { tail=mid-1; } else if(nums[mid] < target) { head=mid+1;; } } return -1; } }

浙公网安备 33010602011771号