Java实现升序排列的整形数组A,元素两两不相等找出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);
		}
	}
}
时间: 2024-11-04 09:20:18

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

关于求出两个整形数组不同元素,要求效率最高

由于两个数组,一比较就会出现两次for循环,所以我能想到的就是组合求出现次数,这样子,就不会出现两次for循环,上代码,希望有看到的提出更好的方法 1 #include <iostream> 2 using namespace std; 3 4 void printarray(int *arr, int size) 5 { 6 if (arr == nullptr) 7 { 8 return; 9 } 10 cout << endl; 11 for (int i = 0; i &l

剑指Offer(Java版)第六十七题:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口, 他们的最大值分别为{4,4,6,6,6,5}。

/*给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 示例 1: nums1 = [1, 3] nums2

【转】一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。

转自:http://zhedahht.blog.163.com/ 题目:一个数组中有三个数字a.b.c只出现一次,其他数字都出现了两次.请找出三个只出现一次的数字. 分析:在博客http://zhedahht.blog.163.com/blog/static/2541117420071128950682/中我们讨论了如何在一个数组中找出两个只出现一次的数字.在这道题中,如果我们能够找出一个只出现一次的数字,剩下两个只出现一次的数字就很容易找出来了. 如果我们把数组中所有数字都异或起来,那最终的结

【面试题】-数组A中任意两个相邻元素大小相差1,找出某个数在数组A中的位置。(所有位置 )

题目描述 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置. 解题思路 对于目标t,由当前位置a[index]比较开始,下一个可能位置为index = abs(t-a[index]),因为要找出所有的位置,所以找出第一个下标位置之后,再从这个下标的下一个开始重新查找. 代码实现 #include <stdio.h> #include <stdlib.h> #include <math.h> int find_num(int a[

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

用Java编程语言对一个无序整形数组进行排序(冒泡排序,选择排序,插入排序)

public static void main(String[] args) { /** * 冒泡排序 * 思路:每个轮次都让第一个数和其后所有的数进行轮比较,如果这轮的第一个数大则和其下一个数交换位置,如果他一直大则冒泡的最后一位 * 1.除了最后一位,前面的数都需要进行冒泡 * 2.第一轮,第一个数进行冒泡,和其后的数进行比较 * 3.第二轮,新序列的第一个数进行冒泡 */ int[] ary=new int[]{90,50,40,60,55}; //外层循环控制有多少个数需要比较的轮数,最

整形数组的元素分类

一个整型数组,姑且将所有元素都设置为正整数,例如{1,2,3,4,5,6,7,8,9,10}现在要求将数组中的奇数放置到数组前面部分,偶数放置到数组的后面部分,应该怎么做呢?这个小编程题并不算难,很容易能够想到思路,我的第一种思路是这样:将数组拷贝一份,遍历拷贝的数组,奇数放到原数组前面部分,从下标0开始,偶数放到原数组后面部分,从最大下标开始,代码如下: void sort(int *arr, int sz) //指向数组的指针和数组大小 { int *arr2=(int *)malloc(s

输入一个整形数组,元素有正有负,一个或者多个连续的元素为其子数组,求所有子数组中和的最大值

public class Zhejiang { public static void main(String[] args) { int[] arr=new int[] {1,-2,3,10,-4,7,2,-5}; int i=getGreatestSum(arr); System.out.println(i); } private static int getGreatestSum(int[] arr) { if (arr==null||arr.length==0) { return 0; }