从长度为n的数组中找出同时满足下面两个条件的所有元素,时间复杂度为O(n)。
(1)该元素比放在它前面的所有元素都大;
(2)该元素比放在它后面的所有元素都小。
你的题目意思不太明确,第一个元素因为前面没有,不知道算不算比前面的都大,在我的程序里,不算。如果要算上,你再修改下就可以了。
1.O(n^2)算法
依次扫描数组中的每个元素,看这个元素是否满足上面的条件,对每一个元素都必须将它与数组中剩余的n-1个元素之间进行比较,所以,一共需要比较n(n-1)次,算法的时间复杂度为O(n^2).
2.O(n)的算法
按照下面的方法所示,用一个数组记录扫描到当前位置时,该元素前面的最大元素,再用一个数组记录,扫描到当前位置时,该元素后面的最小元素.最后用,当前位置的元素和扫描到当前位置时该元素前面的最大元素值,扫描到当前位置时该元素后面的最小元素值和它进行比较就可以得到一个boolean类型的数组,用来记录当前位置上的元素是否满足条件。
private static boolean[] chooseElement(int[] a) {
// 扫描到当前位置时,该元素前卖的最大元素
int max[] = new int[a.length];
// 扫描到当前位置时,该元素后面的最小元素
int min[] = new int[a.length];
for (int i = 0; i < a.length; i++) {
max[i] = a[i];
min[i] = a[i];
}
for (int i = 1; i < a.length; i++) {
if (max[i] < max[i - 1]) {
max[i] = max[i - 1];
}
}
for (int i = a.length - 2; i >= 0; i--) {
if (min[i] > min[i + 1]) {
min[i] = min[i + 1];
}
}
boolean result[] = new boolean[a.length];
for (int i = 0; i < a.length; i++) {
if (a[i] >= max[i] && a[i] <= min[i]) {
result[i] = true;
} else {
result[i] = false;
}
}
return result;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Q690440
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 1, 4, 7, 7, 2, 8, 9, 10, 13, 11, 17 };
var result = solve(arr);
foreach (var item in result)
Console.WriteLine(item);
}
private static IEnumerable<int> solve(int[] arr)
{
int max = arr[0];
int min = arr[arr.Length - 1];
int[] aa = new int[arr.Length];
int[] ai = new int[arr.Length];
for (int i = 0; i < arr.Length - 1; i++)
{
aa[i] = max;
ai[arr.Length - i - 1] = min;
if (arr[i] > max) max = arr[i];
if (arr[arr.Length - i - 1] < min) min = arr[arr.Length - i - 1];
}
for (int i = 0; i < arr.Length - 1; i++)
{
if (arr[i] > aa[i] && arr[i] < ai[i]) yield return arr[i];
}
}
}
}