一、问题描述
一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
二、解题思路
构建一个数组min_right[],满足min_right[i]是当前位i至最后数组中最小的那个数。
定义一个当前最大值用于比较,定义list用来存数据。
找出值,放入list中。
输出这些数。
三、注意事项
为什么这个数一定满足:max <= array[i] = min_right[i]?
answer:
1.为什么要定义max?因为他满足其左边的数都小于等于它。
2.为什么max <= array[i]?使得array[i]满足其左边的数都小于等于它。
3.为什么array[i] = min_right[i]?而不是小于或者大于?
1)小于不成立,违反了min_right设立的初衷。
2)大于不成立,违反了右边的数都大于等于它。
4.这一句中:max = max > array[i] ? max : array[i]; 如果存在非array[i]的max较大,并且等于min_right[i]?
1)不成立,如果max = min_right[i] > array[i],不满足第三问的大于不成立。
四、代码实现
见我的github:SpecialNum