class Solution {
public int findContentChildren(int[] g, int[] s) {
int sum = 0, index = 0;
Arrays.sort(g);
Arrays.sort(s);
for (int i = 0; i < s.length && index < g.length; i++) {
if(g[index] <= s[i]){
sum++;
index++;
}
}
return sum;
}
}
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length <= 1) {
return nums.length;
}
int now = 0;
int pre = 0;
int sum = 1;
for (int i = 1; i < nums.length; i++) {
now = nums[i] - nums[i - 1];
boolean b = (now > 0 && pre <= 0) || (now < 0 && pre >= 0);
if (b) {
sum++;
pre = now;
}
}
return sum;
}
}
class Solution {
public int maxSubArray(int[] nums) {
int now = 0;
int ans = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
now += nums[i];
if(now > ans){
ans = now;
}
if(now < 0){
now = 0;
}
}
return ans;
}
}
class Solution {
public int maxProfit(int[] prices) {
int ans = 0;
for (int i = 1; i < prices.length; i++) {
ans += Math.max(prices[i] - prices[i - 1], 0);
}
return ans;
}
}
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) {
return true;
}
int MAX = 0;
for (int i = 0; i <= MAX; i++) {
MAX = Math.max(MAX, i + nums[i]);
if (MAX >= nums.length-1) {
return true;
}
}
return false;
}
}
class Solution {
public int jump(int[] nums) {
int ans = 0;
int next = 0;
int temp = 0;
for (int i = 0; i <= next && next < nums.length - 1; i++) {
//记录当前位置的最远
temp = Math.max(temp, i + nums[i]);
if(i == next){
next = temp;
ans++;
}
}
return ans;
}
}
[https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/](1005. K 次取反后最大化的数组和 “https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/”)
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
if (nums.length == 1) {
return k % 2 == 0 ? nums[0] : -nums[0];
}
Arrays.sort(nums);
int sum = 0;
int index = 0;
for (int i = 0; i < k; i++) {
if (i < nums.length - 1 && nums[index] < 0) {
nums[index] = -nums[index];
//判断是否要右移
//index指向变负后代价最小的值
if (nums[index] >= Math.abs(nums[index + 1])) {
index++;
}
continue;
}
nums[index] = -nums[index];
}
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}
}
有一段为负 就不考虑从那段开始
总体为负 则不能一周
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int now = 0;
int sum = 0;
int ans = 0;
for (int i = 0; i < gas.length; i++) {
now += gas[i] - cost[i];
sum += gas[i] - cost[i];
if (now < 0) {
now = 0;
ans = i + 1;
}
}
if (sum < 0) {
return -1;
}
return ans;
}
}
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] candies = new int[len];
candies[0] = 1;
for (int i = 1; i < len; i++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
} else {
candies[i] = 1;
}
}
for (int i = len - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candies[i] = Math.max(candies[i], candies[i + 1] + 1);
}
}
int ans = 0;
for(int i:candies){
ans+=i;
}
return ans;
}
}
给20诏令 有10块给10块+5块 没有就3张5块
class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0;
int ten = 0;
for (int i = 0; i < bills.length; i++) {
if (bills[i] == 5) {
five++;
} else if (bills[i] == 10) {
five--;
ten++;
} else {
if (ten > 0) {
ten--;
five--;
} else {
five -= 3;
}
}
if(five < 0 || ten < 0){
return false;
}
}
return true;
}
}
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 身高从大到小排(身高相同k小的站前面)
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) {
return a[1] - b[1];
}
return b[0] - a[0];
});
LinkedList<int[]> que = new LinkedList<>();
for (int[] p : people) {
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}
}
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, Comparator.comparingInt(a -> a[0]));
int count = 1;
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]) {
count++;
} else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]);
}
}
return count;
}
}
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int remove = 0;
int pre = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if(pre > intervals[i][0]){
remove++;
//去掉右 长的集合
pre = Math.min(pre,intervals[i][1]);
}
else{
pre = intervals[i][1];
}
}
return remove;
}
}
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> ans = new ArrayList<>();
int[] mp = new int[30];
char[] c = s.toCharArray();
for (int i = 0 ; i < c.length; i++) {
mp[c[i] - 'a'] = i;
}
int index = 0;
int now = -1;
for (int i = 0; i < c.length; i++) {
index = Math.max(index, mp[c[i] - 'a']);
if (i == index) {
ans.add(i - now);
now = i;
}
}
return ans;
}
}
class Solution {
public int[][] merge(int[][] intervals) {
LinkedList<int[]> res = new LinkedList<>();
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
res.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= res.getLast()[1]) {
int start = res.getLast()[0];
int end = Math.max(intervals[i][1], res.getLast()[1]);
res.removeLast();
res.add(new int[]{start, end});
}
else {
res.add(intervals[i]);
}
}
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
//每遇到后比前小 就把前-1 并标记
for (int i = s.length() - 2; i >= 0; i--) {
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i + 1;
}
}
for(int i = start;i < s.length();i++){
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
}
class Solution {
public int maxProfit(int[] prices, int fee) {
int buy = prices[0] + fee;
int sum = 0;
for (int p : prices) {
if (p + fee < buy) {
buy = p + fee;
} else if (p > buy) {
sum += p - buy;
buy = p;
}
}
return sum;
}
}
class Solution {
int res = 0;
int minCame(TreeNode root) {
if (root == null) {
return 2;
}
int left = minCame(root.left);
int right = minCame(root.right);
if (left == 2 && right == 2) {
return 0;
}else if(left == 0 || right == 0){
res++;
return 1;
}else{
return 2;
}
}
public int minCameraCover(TreeNode root) {
if(minCame(root) == 0){
res++;
}
return res;
}
}
贪心完结