zoukankan      html  css  js  c++  java
  • 面试金典--9.3

    题目描述:给定有序数组,要求找出A[i]=i的索引。(没有重复元素)

    简单粗暴的方法:遍历一遍(这里可以优化,若当前A[i] != i,但是A[i] > i,那么因为数组有序,所以后面的元素不可能满足条件,可以直接输出了,这个思想可以用到有重复元素的情况下)。

    二分递归法:比较A[mid]与mid的关系,等于则返回,小于说明左半部分不可能有满足的,同理右半部分。

     1 #include <iostream>
     2 #include <queue>
     3 #include <climits>
     4 #include <algorithm>
     5 #include <memory.h>
     6 #include <stdio.h>
     7 #include <ostream>
     8 #include <vector>
     9 #include <list>
    10 #include <cmath>
    11 #include <string>
    12 #include <stdexcept>
    13 #include <stack>
    14 using namespace std;
    15 
    16 int fun(int arrayP[],int n,int s,int e)
    17 {
    18     if(s < e || s < 0 || e >= n)
    19         return -1;
    20     int mid = (s+e)/2;
    21     if(arrayP[mid] == mid)
    22         return mid;
    23     else if(arrayP[mid] < mid)
    24         return fun(arrayP,n,mid+1,e);
    25     else
    26         return fun(arrayP,n,s,mid-1);
    27 }
    28 
    29 int main()
    30 {
    31     
    32     return 0;
    33 }

    如果有重复元素,就不能向这样去解了,必须考虑重复的问题,但是可以利用之前提到的思想进行优化,缩小左右部分遍历的范围。

    如,重复元素时,A[5] = 3,那么最多只能在0~3之间有了。

  • 相关阅读:
    Acdream 1174 Sum 暴力
    Acdream 1114 Number theory 莫比乌斯反演
    Acdream 1007 快速幂,模乘法
    UVa 10023
    UVa 11027
    UVa 11029
    UVa 10820
    UVa 10791
    UVa 11121
    UVa 106
  • 原文地址:https://www.cnblogs.com/cane/p/3795456.html
Copyright © 2011-2022 走看看