【题目描述】
AcWing 1055. 股票买卖 II
【思路】
双指针 i,j 一前一后扫描,找出连续递增区间[a,b],则a是买进点,b是抛出点。由于不能同时参与多笔交易,所以下一递增区间从b + 1
开始搜索。
import java.util.Scanner;
public class Main{
static int N = 100010;
static int f[] = new int[N];
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
for(int i = 0; i < n; i ++) f[i] = reader.nextInt();
int i = 0, j = i + 1;
int ans = 0;
while(j < n){//7 1 5 3 6 4
//[i, j]
while(j < n && f[i] >= f[j])//前大后小
{
i ++;
j ++;
}
int a = i; //递增区间的起始下标为a
while(j < n && f[i] < f[j]){//前小后大 严格升序 i不动 j++
i ++;
j ++;
}
int b = j - 1;//递增区间的结束下标为b
ans += f[b] - f[a];
//跳过该递增区间
i = j;
j = i + 1;
}
System.out.println(ans);
}
}
看到一种 更简便的做法。即如果相邻两天的股票价格是递增的则前一天买进,第二天抛出。此效果与找到递增区间[a,b]第a+1天买进,第b+1天卖出等价。
import java.util.Scanner;
public class Main{
static int N = 100010;
static int f[] = new int[N];
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
for(int i = 0; i < n; i ++) f[i] = reader.nextInt();
int ans = 0;
for(int i = 1; i < n; i ++)
if(f[i] > f[i - 1])
ans += f[i] -f[i - 1];
System.out.println(ans);
}
}