845. 数组中的最长山脉
int n = arr.length;
if(n < 3) return 0;
int ans = 0;
for(int i = 1; i < n - 1; i++) {
if(arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {找到山峰
int l = i - 1;
int r = i + 1;
while(l >= 1 && arr[l - 1] < arr[l]) l--;找左边界
while(r <= n - 2 && arr[r + 1] < arr[r]) r++;找右边界
ans = Math.max(ans, r - l + 1);
}
}
return ans;
881. 救生艇
左右开弓
Arrays.sort(people);
int l = 0;
int r = people.length - 1;
int ans = 0;
while(l <= r) {
if(l == r) {此时只有一个人了,直接单独上船
ans++;
break;
}
if(people[l] + people[r] > limit) {胖瘦搭配不了
ans++;
r--;
}else {能搭配
ans++;
r--;
l++;
}
}
return ans;
904. 水果成篮
int left = 0, riht = 0, ans = 0;
int ln = fruits[left], rn = fruits[riht];
while(riht < fruits.length) {
if(fruits[riht] == ln || fruits[riht] == rn) {
ans = Math.max(ans, riht - left + 1);
riht++;
}else {
left = riht - 1;保持两种,因为上面right已经加过了
ln = fruits[left];
rn = fruits[riht];
while(left >= 1 && (fruits[left - 1] == ln || fruits[left - 1] == rn)) {折回去看左边界
left--;
}
ans = Math.max(ans, riht - left + 1);
}
}
return ans;