码迷,mamicode.com
首页 > 编程语言 > 详细

Java实现升序排列的整形数组A,元素两两不相等找出A[i]=i的数据

时间:2017-09-16 11:36:03      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:java;a[i]=i;

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);
		}
	}
}


本文出自 “Apple” 博客,请务必保留此出处http://59465168.blog.51cto.com/5268021/1965755

Java实现升序排列的整形数组A,元素两两不相等找出A[i]=i的数据

标签:java;a[i]=i;

原文地址:http://59465168.blog.51cto.com/5268021/1965755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!