文章目录
分发饼干
贪心,局部最优推出全局最优,维护孩子的胃口,从最小开始一个个满足。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int start = 0;
for(int i=0;i<s.length&&start<g.length;i++){
if(g[start]<=s[i]){
start++;
count++;
}
}
return count;
}
}
K 次取反后最大化的数组和
第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
第二步:从前向后遍历,遇到负数将其变为正数,同时K–
第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
如果是k是偶数次那就反复对同一个数进行取反 总体的sum不会改变,奇数次则会变成负的
class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
if (A.length == 1) return K % 2 == 0 ? A[0] : -A[0];
Arrays.sort(A);
int sum = 0;
int idx = 0;
for (int i = 0; i < K; i++) {
if (i < A.length - 1 && A[idx] < 0) {
A[idx] = -A[idx];
if (A[idx] >= Math.abs(A[idx + 1])) idx++;
continue;
}
A[idx] = -A[idx];
}
for (int i = 0; i < A.length; i++) {
sum += A[i];
}
return sum;
}
}
柠檬水找零
这题就是简单模拟我感觉
class Solution {
public boolean lemonadeChange(int[] bills) {
int f=0,t=0;
for(int bill:bills){
if(bill==5){
f++;
}else if(bill==10){
if(f==0){
return false;
}
f--;
t++;
}
if(bill==20){
if(f>0&&t>0){
f--;
t--;
}
else if(f>=3){
f-=3;
}else{
return false;
}
}
}
return true;
}
}
摆动序列
其实就是找最多的高低节点
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums == null || nums.length <= 1) {
return nums.length;
}
//当前差值
int curDiff = 0;
//上一个差值
int preDiff = 0;
int count = 1;
for (int i = 1; i < nums.length; i++) {
//得到当前差值
curDiff = nums[i] - nums[i - 1];
//如果当前差值和上一个差值为一正一负
//等于0的情况表示初始时的preDiff
if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
count++;
preDiff = curDiff;
}
}
return count;
}
}