[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++;
}
}
这是一个循环数组,也就是最小到最大是连续排列的,但是循环。找到这里最小的值,求代码~
以上只是举例,实际测试的么。避免小数据量不好看出效果。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++;
}
}
//linq Min()函数 int[] q = new int[] { 4, 5, 6, 7, 8, 9 ,1, 2, 3};
Response.Write( q.Min().ToString());
//结果:1
则最小值在后半段数组
else
最小值在前半段数组(前半段和后半段数组都是循环数组)
{
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
}
{
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);
}
}
}