import java.util.ArrayList; //升序排列的整形数组A,元素两两不相等。请设计高效的算法找出A[i]=i的数据。 //使用二种方法 public class BinarySearch { public static void main(String[] args) { int[] nums={-1,1,2,3}; ArrayList<Integer> res=find(nums); for(int e:res){ System.out.println(e+" "); } ArrayList<Integer> res2=binarysearch(nums); for(int e:res2){ System.out.println(e+" "); } } //方法一 public static ArrayList<Integer> find(int[] nums){ int n=nums.length; ArrayList<Integer> all=new ArrayList<Integer>(); for(int i=0;i<n;i++){ if(nums[i]==i){ all.add(nums[i]); }else if(nums[i]>i){ break; } } return all; } //方法二 public static ArrayList<Integer> binarysearch(int[] nums){ ArrayList<Integer> all=new ArrayList<Integer>(); int n=nums.length; if(n==0 || nums[0]>0 || nums[n-1]<n-1){ return all; } //至少有一个元素的值等于其下标 int pivot=binaryFind(nums,0,n-1); all.add(pivot); //向左查找所有目标元素 for(int i=pivot-1;i>=0 && i==nums[i];--i){ all.add(i); } //向右查找所有的目标元素 for(int i=pivot+1;i<n && i==nums[i];i++){ all.add(i); } return all; } public static int binaryFind(int[] nums,int i,int j){ //二分搜索方法 int mid=(i+j)/2; if(nums[mid]==mid){ return mid; }else if(nums[mid]>mid){ return binaryFind(nums,i,mid-1); }else{ return binaryFind(nums,mid+1,j); } } }
时间: 2024-11-04 09:20:18