找到数组轮转的X

问题:用C++代码实现函数 FindSortedArrayRotation。该函数接受一个整数数组和数组的长度。这个整数数组本来是有序的(升序),但被轮转了X位置(对给定的整数X (0 <= X <= (arrayLength - 1)),数组的每个元素向前移动X位置,也就是array[i]移动到array[(i+X)%arrayLength]。请实现FindSortedArrayRotation,找出X。要求时间必须小于O(n)

参考代码:

以下为引用的内容:

int FindSortedArrayRotation(int *array, int arrayLength)
{
  // Insert your implementation here
  /* 
After rotation the array was divided into 2 parts: array[0…x-1] and array[x…arrayLength-1]. And each part is sorted in ascending order. But array[x-1]>array[x]. This is a turn corner. My idea is use binary_search algorithm to find the turn corner.
Running time is O(log(2)).
*/
int left = 0;
int right = arrayLength – 1;
if(array[left]<= array[right]) return 0;
while(left<=right)
{
int middle = (left+right)/2;
if(array[middle -1] > array[middle]) return middle;
if(array[middle] > array[right]) left = middle + 1;
else right = middle -1;
}
return -1;
}

时间: 2024-12-21 02:36:31

找到数组轮转的X的相关文章

PHP数组常用招式

//读取数组 $arr=array("xx"=>"叉叉","yy"=>"歪歪"); echo "读出第一个:".$arr[xx];//统计数组个数 $array=array(aaa,bbb,ccc,ddd); echo "数组个数为:".count($array)."n"; //计算数组单元数目或对象中属性个数 等同sizeof()//快速创建数组 $ar

PHP内核探索之变量(4)- 数组操作

原文:PHP内核探索之变量(4)- 数组操作 上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用的函数系列-数组操作的相关函数做进一步的跟踪. 本文主要内容: PHP中提供的数组操作函数 数组操作函数的实现 结语参考文献 一.PHP中提供的数组操作函数 可以说,数组是PHP中使用最广泛的数据结构之一,正因如此,PHP为开发者提供了丰富的数组操作函数(参见http://cn2.php.net/m

vb-VB 调用fortran函数(已经生成dll),怎么实现数组的传递?

问题描述 VB 调用fortran函数(已经生成dll),怎么实现数组的传递? VB调用fortran生成的dll.传数值,我已经实现,但是传数组地址没成功, 但是用C语言就可以找到数组的首地址,但是VB就不行,请VB的高手指教 fortran 代码如下(生成dll): subroutine ComputeFwd_DC1D(Pm,nParams,AB2,nd) !DEC$ ATTRIBUTES REFERENCE::Pm,nParams,AB2,nd implicit none integer

剑指offer系列之三十四:数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 要找到数组中的逆序对,一种思路是每遍历到一个元素的时候就和后面的元素进行一一比较,这种算法的时间复杂度是O(n2),所以不是很理想.我们可以借鉴归并排序的思想,把数组划分为子数组,然后对每个子数组中的逆序对数进行统计,统计完成后再并到一个新的数组中进行统计,这样就化整为零,实现了高效统计.总计起来思路就是:首先把数组划分为子数组,然后统计子数组中的逆序对数,然后

C语言中数组的一些基本知识小结_C 语言

初始化数组 int ages[3] = {4, 6, 9}; int nums[10] = {1,2}; // 其余的自动初始化为0 int nums[] = {1,2,3,5,6}; // 根据大括号中的元素个数确定数组元素的个数 int nums[5] = {[4] = 3,[1] = 2}; // 指定元素个数,同时给指定元素进行初始化 int nums[3]; nums[0] = 1; nums[1] = 2; nums[2] = 3; // 先定义,后初始化 定义但是未初始化,数组中有

C++实现数组的排序/插入重新排序/以及逆置操作详解_C 语言

插入新的数字重新排序分析:将新的数字与已经排序好的数组中的数字一一比较,直到找到插入点,然后将插入点以后的数字都向后移动一个单位(a[i+1]=a[i]),然后将数据插入即可. 代码: 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[12];//定义用于存储数字的数组  int n;//输入的新的数字  int i=0,j=0,k=0;//排序用到的变量  cout<<"please i

求高手指点:索引超出了数组界限怎么办?在线等

问题描述 point[GetIntData(str,k,outk)-1]=newPoint(GetIntData(str,k,outk),GetIntData(str,k,outk));这句话报错,索引超出了数组界限求指点,我该怎么办呢? 解决方案 解决方案二:借助vs的调试功能,在抛出异常的那个断点找到"数组界限"变量值的问题,找到你在业务逻辑上所忽视了的重要流程,然后修改你迭代码去正确实现业务逻辑.通常,你此时需要找到vs的"调用堆栈"窗口,然后双击前面一个Ge

js中数组的排序sort方法的原理

最近在百度的项目中要用到对数组进行排序,当然一开始自然想到了数组的sort方法,这方法应用非常简单,大致如下:  代码如下 复制代码  window.onload=function(){         var arr=[2,55,55,1,75,3,9,35,70,166,432,678,32,98];         var arr2=["George","John","Thomas","James","Adre

在数组中查询指定字符函数

在数组中查询指定字符函数 #include <iostream> using namespace std; bool find(int a[], int n, const int &sum, int &x, int &y) {     int i = 0, j = n-1, csum;     while (i < j)     {         csum = a[i] + a[j];         if (csum == sum)         {