- [1 åè°æ åçªå£åå
¶æ´æ°ç»æ](#1)
* [1.1 çªå£](#11)
+ [1.1.1 æ»å¨çªå£æ¯ä»ä¹ï¼](#111)
+ [1.1.2 æ»å¨çªå£è½åä»ä¹ï¼](#112)
+ [1.1.3 ç»´æ¤çªå£æ»å¨çæ´æ°ç»æ](#113)
+ [1.1.4 é«é¢é¢ï¼æ±æ»å¨çªå£æå¤§å¼](#114)
+ [1.1.5 é«é¢é¢äºï¼è¾¾æ åæ°ç»æ°éé®é¢](#115)
+ [1.1.6 å¦ä½ä¼åä¸ä¸ªé®é¢ï¼](#116)
* [1.2 åè°æ ](#12)
+ [1.2.1 åè°æ ç»æ](#121)
+ [1.2.2 åè°æ çåºç¨](#122)
1 åè°æ åçªå£åå
¶æ´æ°ç»æ
1.1 çªå£
1.1.1 æ»å¨çªå£æ¯ä»ä¹ï¼
> çªå£åªæ¯æä»¬èæµ·ä¸çä¸ä¸ªèå´ï¼ç¨è¿LåRæ¥è§å®æä»¬çªå£çè¾¹çãä¿è¯L<=Rè¿ä¸ªæ¡ä»¶
1ãæ»å¨çªå£æ¯ä¸ç§æ³è±¡åºæ¥çæ°æ®ç»æï¼
2ãæ»å¨çªå£æå·¦è¾¹çLåå³è¾¹çR
3ã卿°ç»æè
å符串æè
ä¸ä¸ªåºåä¸ï¼è®°ä¸ºS,çªå£å°±æ¯S[L...R]è¿ä¸é¨å
4ãLå¾å³æ»å¨æå³çä¸ä¸ªæ ·æ¬åºäºçªå£ï¼Rå¾å³æ»æå³çä¸ä¸ªæ ·æ¬è¿äºçªå£
5ã LåRé½åªè½å¾å³æ»å¨
1.1.2 æ»å¨çªå£è½åä»ä¹ï¼
æ»å¨çªå£ãé¦å°¾æéçæå·§ï¼è¯´ç½äºå°±æ¯ä¸ç§æ±è§£é®é¢çæµç¨è®¾è®¡ã
1.1.3 ç»´æ¤çªå£æ»å¨çæ´æ°ç»æ
> ä¾å¦æä»¬æ±çªå£å
æå¤§å¼é®é¢
> ç¨åè°å端é忥å®ç°ï¼å端éåå°±æ¯æä»¬çååé¾è¡¨ç»æãæä»¬ä¿è¯æä»¬çå端éåä»å¤´é¨å°å°¾é¨æ°å¼æ¯**ä»å¤§å°å°**ç
1ã 妿çªå£çRä½ç½®å¾å³ç§»å¨ï¼æä»¬æè¿å
¥çªå£çè¿ä¸ªæ°ä»å°¾é¨å å
¥å°å端éåã妿å½åæ°æ¯è¯¥æ°çåä¸ä¸ªæ°å¤§ï¼ä»å°¾é¨çï¼é£ä¹éåä¸å°äºçäºçæ°å¼¹åºãç´å°å°äºéåçåä¸ä¸ªæ°ï¼å å
¥è¯¥æ°ã
2ã妿çªå£çLä½ç½®å¾å³ç§»å¨ï¼é¢ç¤ºçææ°è¦åºæä»¬ççªå£ï¼æä»¬ä»å端éåç头é¨è§çè¦åºå»çæ°æ¯ä¸æ¯æä»¬å¤´é¨éåçæ°ãæ¯å°±å¼¹åºå¤´é¨çæ°ï¼ä¸æ¯å°±ä¸å任使ä½
3ãæä»¬çªå£ç»æä¸ç´è¢«ç»´æ¤ï¼å端éåå³è¾¹è¿ï¼å·¦è¾¹åºãé£ä¹çªå£çæå¤§å¼å°±æ¯æä»¬å端éåæå·¦ä¾§ï¼å¤´é¨ï¼çå¼
==å端éåç»æå®è´¨ä¸æçæ¯ï¼å¦ææ¤æ¶å½¢æççªå£ç¶åµï¼ä¸æ³è®©Rå¾å³å¨äºï¼è让Lå¾å³å¨ãè°ä¼ä»¥æ¤æä¸ºæå¤§å¼çä¼å
级ã为ä»ä¹å¼¹åºçæ°ä¸åæ¾åï¼åå æ¯å¨çªå£æ»å¨çè¿ç¨ä¸ï¼è¢«å¼¹åºçæ°çä¼å
级已ç»è¢«åæ¥ç大æ°å代äºï¼è¿å°±æ¯å°¾ç«¯å å
¥ï¼åä¸ä¸ªæ°æ¯å½åæ°å°åå¼¹åºï¼æ¯å½åæ°å¤§å°±å å
¥å½åæ°çéç==
> åä¹ï¼å¦ææä»¬è¦çªå£å
æå°å¼ï¼åªéè¦ç»´æ¤æä»¬çå端éååè°éå¢çï¼æ¢ç±å°å°å¤§çå³å¯
å¤æåº¦ï¼çªå£æ»å¨ç»è¿çæ°ï¼æå¤è¿å端éå䏿¬¡ï¼æå¤åºå端éå䏿¬¡ï¼å¦æçªå£æ»å¨äºN个æ°ï¼æ¶é´å¤æåº¦å°±æ¯O(N)ï¼å次平åO(1)ã
1.1.4 é«é¢é¢ï¼æ±æ»å¨çªå£æå¤§å¼
å设ä¸ä¸ªåºå®å¤§å°ä¸ºWççªå£ï¼ä»¥æ¤åè¿arrï¼è¿åæ¯ä¸æ¬¡ååºç¶åµçæå¤§å¼
ä¾å¦ï¼`arr=[4, 3, 5, 4, 3, 3, 6, 7]`
è¿åï¼`[5, 5, 5, 4, 6, 7]`
åæï¼çªå£èµ·å§æ¯4,3,5,çªå£å
æå¤§å¼æ¯5ãçªå£å峿»å¨å为3,5,4æå¤§å¼5......
```Java
package class01;
import java.util.LinkedList;
public class Code01_SlidingWindowMaxArray {
public static int[] getMaxWindow(int[] arr, int w) {
if (arr == null || w < 1 || arr.length < w) {
return null;
}
// Javaä¸LinkedListå°±æ¯å端éåï¼ååé¾è¡¨
// å
¶ä¸æ¾çæ¯ä¸æ ä½ç½®ï¼å¤´ä»£è¡¨ ï¼å¤§->å°ï¼å°¾
LinkedList qmax = new LinkedList();
// çªå£å¨æ»å¨çè¿ç¨ä¸ï¼æç»ä¼çæarré¿åº¦-çªå£èµ·å§å®½åº¦+1个å¼
int[] res = new int[arr.length - w + 1];
int index = 0;
// L...R
// R
for (int R = 0; R < arr.length; R++) { // å½å让 i -> [i] è¿çªå£ ï¼ i å°±æ¯ r
// R ä½ç½®çå¼ å¯ä»¥æ¾å¨æ¯ä»å¤§çæ°åï¼æè
空
// å端éåä¸ä¸ºç©ºï¼ä¸å端éåå°¾é¨çå¼å°äºå½åè¦è¿å
¥çªå£çå¼
while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]) {
// å端éåä»å°¾é¨å¼¹åº
qmax.pollLast();
}
// ç»è¿ä¸è¿°çwhileï¼æç»æå½åè¿å
¥çªå£çæ°æ¾å
¥å端éåçå°¾é¨
qmax.addLast(R);
// æ°è¿æ¥äº
// 妿çªå£æ²¡æå½¢æWçé¿åº¦ä¹åï¼ä¸å¼¹åºæ°åç
// å½å䏿 æ¯R, R-Wå°±æ¯éè¦è¿æç䏿 ã
// 妿å端éåç头é¨ä¿åç䏿 çäºR-Wï¼å°±å¤´é¨å¼¹åºãå®è´¨R-Wå°±æ¯æä»¬åå§ç»æçL䏿
if (qmax.peekFirst() == R - w) {
qmax.pollFirst();
}
// 以ä¸çªå£æ´æ°åå®äº
// çªå£æ²¡æå½¢æWé¿åº¦ä¹åï¼ä¸æ¶éçæ¡ãå½¢æWé¿åº¦åï¼æ¯ä¸æ¬¡æ¶éä¸ä¸ªçæ¡
if (R >= w - 1) {
res[index++] = arr[qmax.peekFirst()];
}
}
return res;
}
// for test
public static int[] rightWay(int[] arr, int w) {
if (arr == null || w < 1 || arr.length < w) {
return null;
}
int[] res = new int[arr.length - w + 1];
int index = 0;
int L = 0;
int R = w - 1;
while (R < arr.length) {
int max = arr[L];
for (int i = L + 1; i <= R; i++) {
max = Math.max(max, arr[i]);
}
res[index++] = max;
L++;
R++;
}
return res;
}
// for test
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1));
}
return arr;
}
// for test
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
public static void main(String[] args) {
int testTime = 100000;
int maxSize = 100;
int maxValue = 100;
System.out.println("test begin");
for (int i = 0; i < testTime; i++) {
int[] arr = generateRandomArray(maxSize, maxValue);
int w = (int) (Math.random() * (arr.length + 1));
int[] ans1 = getMaxWindow(arr, w);
int[] ans2 = rightWay(arr, w);
if (!isEqual(ans1, ans2)) {
System.out.println("Oops!");
}
}
System.out.println("test finish");
}
}
```
1.1.5 é«é¢é¢äºï¼è¾¾æ åæ°ç»æ°éé®é¢
ç»å®ä¸ä¸ªæ´å½¢æ°ç»arrï¼åè¡£è¾æ´æ°numãæä¸ªarrä¸çåæ°ç»subï¼å¦ææ³è¾¾æ ï¼å¿
须满足:sub䏿大å¼-sub䏿å°å¼<=numï¼è¿åarrä¸è¾¾æ åæ°ç»çæ°é
> åæ°ç»æ¯è¿ç»ç
> ç»è®º1ï¼å¯¹äº[L...R]èå´è¾¾æ ï¼é£ä¹[L...R]ä¸çåæ°ç»é½è¾¾æ ãmax[L...R]è¯å®æ¯å
¶åæ°ç»çmaxè¦å¤§ï¼min[L...R]è¯å®æ¯å
¶èå´å
çåæ°ç»è¦å°ï¼é£ä¹[L...R]䏿»¡è¶³max - min < numï¼åå
¶åæ°ç»å¿
宿»¡è¶³
> åçå¯å¾ç»è®º2ï¼å¯¹äº[L...R]èå´ä¸è¾¾æ ï¼é£ä¹æ©å±èå´åç[L'...R']ä¹ä¸è¾¾æ
> æä»¬å»ºç«ä¸¤ä¸ªå端éåï¼ä¸ä¸ªæ¯çªå£æå¤§å¼çå端éåï¼ä¸ä¸ªæ¯çªå£æå°å¼çå端éåãæä»¬æ©å±æä»¬ççªå£Rå 1ï¼æ¯æ©å±ä¸ä¸ªå¤ææ¯å¦ä»ç¶è¾¾æ ï¼è¾¾æ ç»§ç»æ©å±ï¼ä¸è¾¾æ å°±åï¼å¯ä»¥å¾å°æ¬æ¬¡åæ°ç»çè¾¾æ æ
åµï¼æ¥çç¼©å°æä»¬ççªå£Lå 1ï¼ç»§ç»...ãçªå£æ»å¨ä¸ä¼åéï¼æ´ä½O(N)
```Java
package class01;
import java.util.LinkedList;
public class Code02_AllLessNumSubArray {
public static int getNum(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return 0;
}
// çªå£å
æå°å¼çæ´æ°ç»æ
LinkedList qmin = new LinkedList();
// çªå£å
çæå¤§å¼çæ´æ°ç»æ
LinkedList qmax = new LinkedList();
int L = 0;
int R = 0;
// [L..R) -> [0,0) çªå£å
æ æ° [1,1)
// [0,1) -> [0~0] çªå£éåªæä¸ä¸ªæ°
int res = 0;
// Læ¯å¼å¤´ä½ç½®ï¼å°è¯æ¯ä¸ä¸ªå¼å¤´
while (L < arr.length) {
// å¦ææ¤æ¶çªå£çå¼å¤´æ¯L,ä¸é¢çwhile工使¯:Rå峿©å°è¿è§ä¸ºæ¢
// Ræ¯æåä¸ä¸ªè¾¾æ ä½ç½®çåä¸ä¸ä¸ªï¼éè¿ä¸æçbreakç»æ¢
while (R < arr.length) {
// Rä½ç½®çæ°è¿å
¥çªå£åï¼æå°å¼çæ´æ°ç»æåæå¤§å¼çæ´æ°ç»æé½è¦æ´æ°
while (!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[R]) {
qmin.pollLast();
}
qmin.addLast(R);
// R -> arr[R],
while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]) {
qmax.pollLast();
}
qmax.addLast(R);
// å¦ææ¤æ¶ä¸æ»¡è¶³äºï¼breakã说æçªå£å·²ç»æé¿å°äºç¬¬ä¸ä¸ªä¸è¾¾æ çæ°è¿æ¥äº
if (arr[qmax.getFirst()] - arr[qmin.getFirst()] > num) {
break;
}
R++;
}
// Ræ¯æåä¸ä¸ªè¾¾æ ä½ç½®çåä¸ä¸ä¸ªï¼ç¬¬ä¸ä¸ªè¿è§çä½ç½®
res += R - L;
// æ£æ¥æå°å¼åæå¤§å¼çæ´æ°ç»æææ²¡æè¿æ
if (qmin.peekFirst() == L) {
qmin.pollFirst();
}
if (qmax.peekFirst() == L) {
qmax.pollFirst();
}
// çªå£å·¦è¾¹çå峿»å¨ï¼çªå£å®¹éæ¤æ¶å1
L++;
}
return res;
}
// for test
public static int[] getRandomArray(int len) {
if (len < 0) {
return null;
}
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int) (Math.random() * 10);
}
return arr;
}
// for test
public static void printArray(int[] arr) {
if (arr != null) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[] arr = getRandomArray(30);
int num = 5;
printArray(arr);
System.out.println(getNum(arr, num));
}
}
```
> æ¬é¢æ ¹æ®çªå£æ»å¨å»ºç«äºåè°æ§ï¼ä¸æçç»è®º
1.1.6 å¦ä½ä¼åä¸ä¸ªé®é¢ï¼
1ã æ°æ®ç¶åµå±é¢æ¯å¦å¯ä»¥ä¼å
2ã é®é¢æ¬èº«æ¯å¦å¯ä»¥ä¼åãåè°æ§ï¼é¦ä½æéï¼å¤´æéå¾å³èµ°ï¼å°¾æéå¾å·¦èµ°ï¼ç
> éå°ä¸ä¸ªé®é¢æä»¬å
è§å¯ï¼é®é¢æ¬èº«åèå´æ¯å¦å¯ä»¥å»ºç«åè°æ§ï¼è³äºéè¦ç¨åªä¸ªååæ¥è§£å³ï¼ä¸²å£åé¦ä½æéæ³æ¯å¸¸è§çæµç¨ãæä»¥çªå£åé¦ä½æé主è¦ç¨æ¥è§£å³åè°æ§ç
1.2 åè°æ
1.2.1 åè°æ ç»æ
å¨ä¸ä¸ªæ°ç»ä¸ï¼æ±æ¯ä¸ä¸ªä½ç½®å·¦è¾¹ç¦»å®æè¿çæ¯å®å°çæ°å¨åªï¼å³è¾¹ç¦»å®æè¿çæ¯å®å°çæ°å¨åªã
ä¾å¦[3, 2, 1, 7]ã3左边æ¯å®å°çæè¿çä½ç½®çæ°çä½ç½®æ²¡æï¼ä¸º-1ï¼å³è¾¹æ¯1ä½ç½®ç2ã2左边æ¯å®å°çæè¿çä½ç½®çæ°çä½ç½®æ²¡æï¼ä¸º-1ï¼å³è¾¹æ¯2ä½ç½®ç1çã
ç¨ä¸ä¸ªmapæ¥è®°å½ï¼æ´åè§£O(N^2)ãåè°æ è½å¤å¨O(N)è§£å³
åè°æ ç®æ³æµç¨ï¼
> èç¨¿çº¸ä¸æ¨¡æè¿ä¸ªæ ;
> 没æç¸çå
ç´ çæ
åµï¼åå¤ä¸ä¸ªæ ç»æï¼æå®ä»å°å°å¤§çåè°æ ç»æãä»å·¦å¾å³éåæä»¬çæ°ç»ï¼[3,4,2,5]ï¼ç±äºæ 空ï¼ç¬¬ä¸ä¸ªå
ç´ å¯ä»¥è¿æ ï¼3è¿æ ã
> 1ä½ç½®çæ°4å¯ä»¥è¿æ ï¼å 为没æç ´åä»å°å°å¤§çæ çåè°æ§ã
> 2ä½ç½®ç2æ æ³ç´æ¥è¿æ ï¼å 为ä¼ç ´åæ çåè°æ§ãéè¦å¼¹åºæ å
ç´ ï¼å
ç´ ä¸æ¦è¢«å¼¹åºï¼çæç¸åºçè®°å½ã
> 1ä½ç½®ç4å¼¹åºï¼å³è¾¹æè¿çæ¯ä½ å°çæ°ï¼å°±æ¯è°è®©ä½ å¼¹åºçæ°ï¼æä»¥4çå³è¾¹æè¿çæ¯4å°çæ°æ¯2ã左边æè¿æ¯ä½ å°çæ°ï¼å°±æ¯ä½ 卿 ä¸åççæ°ï¼æä»¥4ç左边æè¿çæ¯4å°çæ°æ¯3ã
> 2ä½ç½®ç2æ¤æ¶ä»ç¶æ æ³è¿æ ï¼å 为æ 䏿¤æ¶è¿æ3ï¼é£ä¹3å¼¹åºã3çæè¿çå³ä¾§æ¯3å°çæ°æ¯2ï¼3æ¯æ åºå
ç´ ï¼æ²¡æåççå
ç´ ï¼æä»¥3左侧æè¿çæ¯3å°çæ°æ²¡æï¼ä½ç½®ç½®ä¸º-1ãå
¶ä»å
ç´ åç......ã
> æåå¦ææ²¡æå
ç´ äºï¼æ ä¸å
ç´ å¼¹åºï¼æ¤æ¶ä¸æ¯å
¶ä»å
ç´ è¿«ä½¿çå¼¹åºï¼æä»¥èªç¶å¼¹åºçå³ä¾§æè¿æ¯å®å°çæ è¿å-1ã左侧æè¿æ¯å®å°ççå®å¨æ 䏿¯å¦åçå
¶ä»å
ç´
å¯ä»¥éæ©ä»»æä½ç½®å»è¯æï¼è¯æç¥
> 妿åå¨ç¸çå
ç´ çæ
åµï¼æä»¬æ 䏿¯ä¸ªå
ç´ ä¿å为list表示ç¸çå
ç´ åè¡¨ãæ æ³ç´æ¥è¿å
¥åè°æ æ¶ï¼å¼¹åºlistæå³ä¾§çå
ç´ ï¼è¯¥å
ç´ å³ä¾§æè¿çæ¯èªå·±å°çæ°ï¼å°±æ¯è¿«ä½¿å®å¼¹åºçé£ä¸ªæ°ã该å
ç´ å·¦ä¾§æè¿æ¯å®å°çæ°ï¼å°±æ¯èªèº«çè¿ä¸ªliståçççlistçæå³çæ°ãlistçç¸åå
ç´ æä¸¤ç§æ
åµï¼ä¸ç§æ¯ä¸¤ä¸ªæ°ç¸ç䏿¨çï¼å¦å¤ä¸ç§æ¯æä¸ªä½ç½®éæ¾äºä¸é´ä½ç½®çæ°åéå°ç¸çå
ç´ ï¼è¿å
¥ä¸ä¸ªlistä¸å»ãç»æ 模æå¯çåº
```Java
package class01;
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
public class Code03_MonotonousStack {
// æ°ç»ä¸æ²¡æéå¤å¼çæ
åµ
public static int[][] getNearLessNoRepeat(int[] arr) {
int[][] res = new int[arr.length][2];
Stack stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
while (!stack.isEmpty() && arr[stack.peek()] > arr[i]) {
int popIndex = stack.pop();
int leftLessIndex = stack.isEmpty() ? -1 : stack.peek();
res[popIndex][0] = leftLessIndex;
res[popIndex][1] = i;
}
stack.push(i);
}
while (!stack.isEmpty()) {
int popIndex = stack.pop();
int leftLessIndex = stack.isEmpty() ? -1 : stack.peek();
res[popIndex][0] = leftLessIndex;
res[popIndex][1] = -1;
}
return res;
}
// arr [3, 2, 1, 4, 5]
// 0 1 2 3 4
// 表示 0è¿ä¸ªæ°å·¦è¾¹æè¿æ¯0å°ç没æï¼ä½ç½®æ¯-1ï¼å³è¾¹1ã1ä½ç½®æ°å·¦è¾¹æè¿æ¯0å°ç没æ-1ï¼å³è¾¹2
// [
// 0 : [-1, 1 ]
// 1 : [-1, 2 ]
// ]
// æ°ç»ä¸åå¨éå¤å¼çæ
åµ
public static int[][] getNearLess(int[] arr) {
int[][] res = new int[arr.length][2];
// List -> æ¾çæ¯ä½ç½®ï¼åæ ·å¼çä¸è¥¿ï¼ä½ç½®åå¨ä¸èµ·
// ä»£è¡¨å¼ åº -> é¡¶ å° -> 大
Stack> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) { // i -> arr[i] è¿æ
// æ åº -> æ é¡¶ï¼ å° -> 大
while (!stack.isEmpty() && arr[stack.peek().get(0)] > arr[i]) {
List popIs = stack.pop();
// åä½äºä¸é¢ä½ç½®çå表ä¸ï¼ææå å
¥çé£ä¸ª
int leftLessIndex = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);
for (Integer popi : popIs) {
res[popi][0] = leftLessIndex;
res[popi][1] = i;
}
}
// ç¸ççãæ¯ä½ å°ç
if (!stack.isEmpty() && arr[stack.peek().get(0)] == arr[i]) {
stack.peek().add(Integer.valueOf(i));
} else {
ArrayList list = new ArrayList<>();
list.add(i);
stack.push(list);
}
}
while (!stack.isEmpty()) {
List popIs = stack.pop();
// åä½äºä¸é¢ä½ç½®çå表ä¸ï¼ææå å
¥çé£ä¸ª
int leftLessIndex = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);
for (Integer popi : popIs) {
res[popi][0] = leftLessIndex;
res[popi][1] = -1;
}
}
return res;
}
// for test
public static int[] getRandomArrayNoRepeat(int size) {
int[] arr = new int[(int) (Math.random() * size) + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
for (int i = 0; i < arr.length; i++) {
int swapIndex = (int) (Math.random() * arr.length);
int tmp = arr[swapIndex];
arr[swapIndex] = arr[i];
arr[i] = tmp;
}
return arr;
}
// for test
public static int[] getRandomArray(int size, int max) {
int[] arr = new int[(int) (Math.random() * size) + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * max) - (int) (Math.random() * max);
}
return arr;
}
// for test
public static int[][] rightWay(int[] arr) {
int[][] res = new int[arr.length][2];
for (int i = 0; i < arr.length; i++) {
int leftLessIndex = -1;
int rightLessIndex = -1;
int cur = i - 1;
while (cur >= 0) {
if (arr[cur] < arr[i]) {
leftLessIndex = cur;
break;
}
cur--;
}
cur = i + 1;
while (cur < arr.length) {
if (arr[cur] < arr[i]) {
rightLessIndex = cur;
break;
}
cur++;
}
res[i][0] = leftLessIndex;
res[i][1] = rightLessIndex;
}
return res;
}
// for test
public static boolean isEqual(int[][] res1, int[][] res2) {
if (res1.length != res2.length) {
return false;
}
for (int i = 0; i < res1.length; i++) {
if (res1[i][0] != res2[i][0] || res1[i][1] != res2[i][1]) {
return false;
}
}
return true;
}
// for test
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int size = 10;
int max = 20;
int testTimes = 2000000;
for (int i = 0; i < testTimes; i++) {
int[] arr1 = getRandomArrayNoRepeat(size);
int[] arr2 = getRandomArray(size, max);
if (!isEqual(getNearLessNoRepeat(arr1), rightWay(arr1))) {
System.out.println("Oops!");
printArray(arr1);
break;
}
if (!isEqual(getNearLess(arr2), rightWay(arr2))) {
System.out.println("Oops!");
printArray(arr2);
break;
}
}
}
}
```
1.2.2 åè°æ çåºç¨
ç»å®ä¸ä¸ªåªå
嫿£æ´æ°çæ°ç»arrï¼arrä¸ä»»ä½ä¸ä¸ªåæ°ç»subï¼ä¸å®é½å¯ä»¥ç®åº(subç´¯å å)*(subä¸çæå°å¼)æ¯ä»ä¹ï¼é£ä¹ææåæ°ç»ä¸ï¼è¿ä¸ªå¼æå¤§æ¯å¤å°ï¼
```Java
package class01;
import java.util.Stack;
public class Code04_AllTimesMinToMax {
public static int max1(int[] arr) {
int max = Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
int minNum = Integer.MAX_VALUE;
int sum = 0;
for (int k = i; k <= j; k++) {
sum += arr[k];
minNum = Math.min(minNum, arr[k]);
}
max = Math.max(max, minNum * sum);
}
}
return max;
}
public static int max2(int[] arr) {
int size = arr.length;
int[] sums = new int[size];
sums[0] = arr[0];
for (int i = 1; i < size; i++) {
sums[i] = sums[i - 1] + arr[i];
}
int max = Integer.MIN_VALUE;
Stack stack = new Stack();
for (int i = 0; i < size; i++) {
while (!stack.isEmpty() && arr[stack.peek()] >= arr[i]) {
int j = stack.pop();
max = Math.max(max, (stack.isEmpty() ? sums[i - 1] : (sums[i - 1] - sums[stack.peek()])) * arr[j]);
}
stack.push(i);
}
while (!stack.isEmpty()) {
int j = stack.pop();
max = Math.max(max, (stack.isEmpty() ? sums[size - 1] : (sums[size - 1] - sums[stack.peek()])) * arr[j]);
}
return max;
}
public static int[] gerenareRondomArray() {
int[] arr = new int[(int) (Math.random() * 20) + 10];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 101);
}
return arr;
}
public static void main(String[] args) {
int testTimes = 2000000;
System.out.println("test begin");
for (int i = 0; i < testTimes; i++) {
int[] arr = gerenareRondomArray();
if (max1(arr) != max2(arr)) {
System.out.println("FUCK!");
break;
}
}
System.out.println("test finish");
}
}
```