在一个升序的但是经过循环移动的数组中查找指定元素

数组是升序的,数组经过循环移动之后,肯定是有左半部分或者有半部分还是升序的。

代码:

public class SearchRotateArray {
	public static int search(int a[], int l, int u, int x) {
		while(l<=u){
			int m = (l+u)/2;
			if(x==a[m]){
				return m;
			}else if(a[l]<=a[m]){ //左半部分升序排列
				if(x>a[m]){
					l=m+1;
				}else if(x>=a[l]){
					u=m-1;
				}else{// x<a[l]
					l=m+1;
				}
			}else if(a[l]>a[m]){ //右半部分升序
				if(x>a[u]){
					u=m-1;
				}else if(x>=a[m]){
					l=m+1;
				}else{ //x<a[m]
					u=m-1;
				}
			}
		}
		return -1;
	}

	public static void main(String[] args){
		int a[] = {15,16 ,19, 20, 25, 1, 3, 4, 5, 7, 10, 14};
		System.out.println(search(a, 0, a.length - 1, 5));
	}
}

结果:

8

在一个升序的但是经过循环移动的数组中查找指定元素,布布扣,bubuko.com

时间: 2024-12-14 18:46:10

在一个升序的但是经过循环移动的数组中查找指定元素的相关文章

14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)

待完善! 转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4259199.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目: 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输

输入一个已经按升序排序的数组和一个数字 ,在数组中查找两个数,使得他们的和是输入的那个数字

package shuzu; /* * 输入一个已经按升序排序的数组和一个数字 * 在数组中查找两个数,使得他们的和是输入的那个数字,要求时间复杂度为o(n) * 如果有多对数字的和等于输入的数字,输出任意一对即可. */ public class demo1 { private static void findAns(int[] data,int sum) { int size=data.length; int begin =0; int end=size-1; while(begin < s

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。

第 14 题(数组):题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意一对即可.例如输入数组 1.2.4.7.11.15 和数字 15.由于 4+11=15,因此输出 4 和 11. 要求时间是O(n)肯定就只能扫描一遍. 又有两个数字要找,那就只能一个从头向后找 一个从后向前找 初始把大值设为最后一个数, 小值设为第一个数,如果数字和大于和,则减小大数的数值, 反之增大小

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3

给定一个二维数组,数组的特点是:每一行从左到右数据大小依次递增,每一列数据从上到下依次递增,要求判断一个整数是否在这个二维数组中: 设计二维数组如下: 首先,毋庸置疑的的是,遍历一遍数组肯定能判断出来,这也是最笨的方法了,因此,要想提高程序的运行效率就得找出一种高效的方法来查找: 一开始的想法大概都能想到从数组第一行第一列的数开始沿着对角线判断,如果是对角线数据就可以直接返回,比如我们要想查找17这个数,这时候17比0.9.16都要大,因此以0.9.16为对角线的矩形数据就可以排除了,接下来判断

Java-数组:能否用增强for循环实现把键盘输入的数字循环赋给数组中去?

我看到增强型for很方便,试着能不能用增强型for语句把键盘输入的数字赋值到数组的各个元素中去. //使用增强for 循环的将用户输入的数字赋到数组中去package Lianxi;import java.util.*; public class Lianxi46 {public static void main(String[] args) { Scanner input =new Scanner(System.in); int suZu[]=new int[5]; //定义长度为5的数组 f

折半查找------在一个升序的有序数组中查找某个具体的数字

非递归法: #include <stdio.h> #include <stdlib.h> #define number 6  int binsearch(int x, int *arr, int left, int right); int main() { int x = 0, inter = 0; int arr[number] = { 1, 5, 12, 36, 45, 98 }; /* * printf("请输入可查找到的数:> "); * for 

在一个数组中查找两个重复出现的数字

题目如下:现有一个数组长度为n+1,里面存放有1到n-2,顺序不定,其中有两个数字出现了两次,现在要找出那两个数字. 例子A={2, 3, 1, 4, 5, 2, 4}, 这个数组长度为7,存放了1到5,但2和4出现了两次,程序输出2和4 方法1 蛮力查找 主要思想:对于数组中的第i个数,查找i+1到末尾的所有整数,一个数如果出现了两次就可以在第一次后面找到第二次出现的数. 时间复杂度 O(n^2) #include<stdio.h> void find_duplicates(int* num