[4 5 6 7 8 9 1 2 3]
这是一个循环数组,也就是最小到最大是连续排列的,但是循环。找到这里最小的值,求代码~
以上只是举例,实际测试的么。避免小数据量不好看出效果。static void Main(string[] args)
{
    int[] arr = Enumerable.Range(1016, 5000).ToArray();
    Console.WriteLine(FindMin(arr).ToString());
    arr = Enumerable.Range(1000, 5000).Concat(Enumerable.Range(88, 999)).ToArray();
    Console.WriteLine(FindMin(arr).ToString());
    Console.ReadKey();
}2种情况,求结果。
先给一个最慢的直接循环的解答:private static int FindMin(int[] p)
{
    while (true)
    {
        int next = (i + 1) % p.Length;
        int previous = (i - 1);
        if (p[i] > p[next]) return p[next];
        else if (p[i] < p[previous]) return p[i];
        i++;
    }
}

解决方案 »

  1.   


    //linq Min()函数  int[] q = new int[] { 4, 5, 6, 7, 8, 9 ,1, 2, 3};
                   Response.Write( q.Min().ToString());
    //结果:1
      

  2.   

    用Linq的都不得分。
      

  3.   

    if 数组中间的值大于数组第一个值
        则最小值在后半段数组
    else
       最小值在前半段数组(前半段和后半段数组都是循环数组)
      

  4.   

    假定连续数字是递增的:int LeftFindMinValue(int[] array, int left, int right)
    {
        if (array[left] < array[right]) return array[left];    int mid = (left + right) / 2;
        if( array[right] > array[mid] ) return LeftFindMinValue(array, left, mid);
        if( array[right] < array[mid] ) return LeftFindMinValue(array, mid+1, right);
        return array[right];
    }private void Test()
    {
        int[] arr = Enumerable.Range(1000, 5000).Concat(Enumerable.Range(88, 999-88)).ToArray();
        int i = LeftFindMinValue(arr, 0, arr.Length - 1);  //i=88
    }
      

  5.   

    吃饭回来,贴个代码    static void Main(string[] args)
        {
            int[] arr = Enumerable.Range(1016, 5000).ToArray();
            Console.WriteLine(FindMin(arr, 0, arr.Length - 1).ToString());
            arr = Enumerable.Range(1000, 5000).Concat(Enumerable.Range(88, 900)).ToArray();
            Console.WriteLine(FindMin(arr, 0, arr.Length - 1).ToString());
            Console.ReadKey();
        }    private static int FindMin(int[] arr, int start, int end)
        {
            if (arr == null || arr.Length == 0 || arr.Length <= end || start > end)
                throw new Exception();        if (arr[start] < arr[end] || end - start == 0)
                return arr[start];
            else if (end - start == 1)
            {
                return arr[end];
            }
            else
            {
                int midIndex = (end - start) / 2 + start;
                if (arr[start] > arr[midIndex])
                {
                    return FindMin(arr, start, midIndex);
                }
                else
                {
                    return FindMin(arr, midIndex, end);
                }
            }
        }
      

  6.   

    FindMin根本编译不过,没明白要得到什么,楼上的都明白吗?