力扣-数列极差问题

题目描述

n个整数排成的数列,进行如下操作:每次擦去其中两个数a和b,然后在数列中加入一个数 a x b + 1,如此下去直到黑板只剩一个数,在所有按这种操作方式最后得到的数中,最大的记作 max ,最小的为 min,则数列的极差定义为: m = max - min

分析:

以三个数为例:a>b>c,这三个数计算有以下几种结果:

  • ( a x b + 1 ) x c + 1 = a x b x c + c +1
  • ( a x c + 1 ) x b + 1 = a x b x c + b +1
  • ( c x b + 1 ) x a + 1 = a x b x c + a +1

由此可知:先运算小数据得到是大数据,先运算大数据得到的是小数据

我们如是设计代码:用vector存储数据,计算最大数的时候,我们每次娶两个最小的数字计算再将结果 (min1*min2 + 1)放入vector容器中,计算最小数字的时候与之相反即可。

接下来上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
#include<vector>
using namespace std;

//获取数字集中最小的数字并删除
int getTheMin(vector<int> &numbers) {
//遍历
vector <int>::const_iterator i, j = numbers.begin();
int min = *j;
for (i = numbers.begin(); i != numbers.end(); ++i) {
if(*i < *j) {
j = i;
min = *i;
}
}
numbers.erase(j);
return min;
}

//获取数字集中最大的数字并删除
int getTheMax(vector<int> &numbers) {
//遍历
vector <int>::const_iterator i, j = numbers.begin();
int max = *j;
for (i = numbers.begin(); i != numbers.end(); ++i) {
if(*i > *j) {
j = i;
max = *i;
}
}
numbers.erase(j);
return max;
}

int main() {
//存储数据
vector<int> numbers_max;
vector<int> numbers_min;
//元素个数
int n, m;
cin>>n;
//输入
for( int i = 0; i < n; i++ ) {
cin>>m;
numbers_max.push_back(m);
}
numbers_min = numbers_max;
//获取最大值
while(numbers_max.size() != 1) {
int min1 = getTheMin(numbers_max);
int min2 = getTheMin(numbers_max);
numbers_max.push_back(min1*min2 + 1);
}
//获取最小值
while(numbers_min.size() != 1) {
int max1 = getTheMax(numbers_min);
int max2 = getTheMax(numbers_min);
numbers_min.push_back(max1*max2 + 1);
}
cout<<"最大值为:"<<numbers_max.back()<<endl;
cout<<"最小值为:"<<numbers_min.back()<<endl;
}