问题
一个数组,相邻不等。返回任意一个局部最小值。
(重点是 相邻不等,否则无法用此方法)
分析
所谓局部最小值,即左右相邻的数都比他大。当此数为第一个时,只需要右边的比他大即可。最右同理。
代码
生成随机数组,相邻不等
void Random_array(int* array, int num)
{
for (int i = 0; i < num; i++)
array[i] = rand() % 100;
}
void Print_array(int* a, int n)
{
for (int i = 0; i < n; i++)
printf("%d ,", a[i]);
printf("\n");
}
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int Array_del_nextsame(int array[])
{
int num = N;
for (int i = 0; i < N-2; i++)
{
if (array[i]==array[i+1])
{
num -= 1;
for (int j = i; j < N - 1; j++)
array[j] = array[j + 1];
}
}
return num;
}
判断局部最小值
先判断第一个和最后一个数是否符合。
因为相邻不等,所以必有局部最小值。
从中间开始判断,二分法。
int One_min_index(int array[])
{
if (N == 0)
return -1;
if (N == 1)
return 0;
if (array[0] < array[1])
return 0;
if (array[N - 1] < array[N - 2])
return N - 1;
int mid = 0, L = 0, R = N - 1;
while (L <= R)
{
mid = (L + R) / 2;
if (array[mid]<array[mid + 1] && array[mid] < array[mid - 1])
return mid;
if (array[mid - 1] < array[mid])
R = mid - 1;
if (array[mid] > array[mid + 1])
L = mid + 1;
}
}
完整代码
//P19 局部最小值问题,数组无序,但相邻两个元素不相等。
//题目要求 返回数组中一个局部最小值
#include <iostream>
using namespace std;
#define N 30 //N为数组长度,因为C+没有array.length,sizeof出问题还麻烦,所以偷懒
void Random_array(int* array, int num)
{
for (int i = 0; i < num; i++)
array[i] = rand() % 100;
}
void Print_array(int* a, int n)
{
for (int i = 0; i < n; i++)
printf("%d ,", a[i]);
printf("\n");
}
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int Array_del_nextsame(int array[])
{
int num = N;
for (int i = 0; i < N-2; i++)
{
if (array[i]==array[i+1])
{
num -= 1;
for (int j = i; j < N - 1; j++)
array[j] = array[j + 1];
}
}
return num;
}
int One_min_index(int array[])
{
if (N == 0)
return -1;
if (N == 1)
return 0;
if (array[0] < array[1])
return 0;
if (array[N - 1] < array[N - 2])
return N - 1;
int mid = 0, L = 0, R = N - 1;
while (L <= R)
{
mid = (L + R) / 2;
if (array[mid]<array[mid + 1] && array[mid] < array[mid - 1])
return mid;
if (array[mid - 1] < array[mid])
R = mid - 1;
if (array[mid] > array[mid + 1])
L = mid + 1;
}
}
int main()
{
int array[N] = {};
int num = 0;
srand((unsigned int)time(NULL));
for (int j = 0; j < 1000; j++)
{
Random_array(array, N);
num=Array_del_nextsame(array);
Print_array(array,num);
printf("number of min=%d,min index=%d", One_min_index(array), array[One_min_index(array)]);
printf("\n================================================\n");
}
return 0;
}
//
//int main()
//{
//
// int array[30] = { 92 ,11 ,93 ,14 ,34 ,79 ,95 ,12 ,56 ,65 ,45 ,67 ,25 ,14 ,2 ,72 ,5 ,17 ,33 ,85 ,60 ,92 ,49 ,41 ,5 ,12 ,94 ,45 ,57 ,81 };
// Print_array(array,30);
// printf("number of min=%d,min index=%d", One_min_index(array), array[One_min_index(array)]);
//
//
//
// return 0;
//}