提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
贪心算法
一、力扣455. 分发饼干
在这里插入代码片class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
if(s.length == 0){
return 0;
}
int res = 0;
for(int i = 0, j = 0; i < g.length && j < s.length; ){
if(s[j] >= g[i]){
i ++;
j ++;
res ++;
}else{
j ++;
}
}
return res;
}
}
二、力扣376. 摆动序列
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length == 0 || nums.length == 1){
return nums.length;
}
int[] flag = new int[nums.length-1];
List<Integer> list = new ArrayList<>();
for(int i = 0, j = 1; j < nums.length; i ++,j ++){
if(nums[j] - nums[i] > 0){
flag[i] = 1;
}else if(nums[j] - nums[i] < 0){
flag[i] = -1;
}else{
flag[i] = 0;
}
}
for(int i = 0; i < flag.length; i ++){
if(flag[i] == 0){
continue;
}
if(!list.isEmpty()){
if(list.get(list.size()-1) != flag[i]){
list.add(flag[i]);
}
}else{
list.add(flag[i]);
}
}
return list.size()+1;
}
}
三、力扣53. 最大子数组和
在这里插入代码片class Solution {
public int maxSubArray(int[] nums) {
int res = nums[0];
int sum = 0;
for(int i = 0; i < nums.length; i ++){
res = Math.max(res, nums[i]);
if(sum + nums[i] < 0){
sum = 0;
}else{
sum += nums[i];
res = Math.max(res, sum);
}
}
return res;
}
}
四、力扣122. 买卖股票的最佳时机 II
class Solution {
public int maxProfit(int[] prices) {
int res = 0;
for(int i = 1; i < prices.length; i ++){
res += prices[i] - prices[i-1] > 0 ? prices[i] - prices[i-1] : 0;
}
return res;
}
}
五、力扣55. 跳跃游戏
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1){
return true;
}
int coverRange = 0;
for(int i = 0; i <= coverRange; i ++){
coverRange = Math.max(coverRange, i +nums[i]);
if(coverRange >= nums.length -1){
return true;
}
}
return false;
}
}
六、力扣45. 跳跃游戏 II
class Solution {
public int jump(int[] nums) {
if(nums.length == 1){
return 0;
}
int cur = 0, max = 0,res = 0;
for(int i = 0; i <= nums.length; i ++){
max = Math.max(max, nums[i] + i);
if(max >= nums.length-1){
res ++;
break;
}
if(cur == i){
cur = max;
res ++;
}
}
return res;
}
}
七、力扣1005. K 次取反后最大化的数组和
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int j = 0;
for(int i = 0; i < nums.length; i ++){
if(nums[i] <= 0){
nums[i] = -nums[i];
k --;
j = i;
if(k <= 0){
break;
}
}else if(k % 2 == 1){
if(i == 0){
nums[i] = -nums[i];
k = 0;
break;
}else if(nums[i-1] == 0){
k = 0;
break;
}else{
if(nums[i] > nums[i-1]){
nums[i-1] = -nums[i-1];
}else{
nums[i] = -nums[i];
}
k = 0;
break;
}
}
}
if(k % 2 == 1){
nums[nums.length-1] = -nums[nums.length-1];
}
int res = 0;
for(int a : nums){
res += a;
}
return res;
}
}
八、力扣134. 加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0;
int totalSum = 0;
int index = 0;
for(int i = 0; i < gas.length; i ++){
curSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if(curSum < 0){
index = (i+1)%gas.length;
curSum = 0;
}
}
if(totalSum < 0){
return -1;
}
return index;
}
}
九、力扣135. 分发糖果
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] arr = new int[n];
Arrays.fill(arr, 1);
if(n == 1){
return 1;
}
for(int i = 1; i < n; i ++){
if(ratings[i] > ratings[i-1]){
arr[i] = arr[i-1]+1;
}
}
for(int i = n-2; i >= 0; i --){
if(ratings[i] > ratings[i+1]){
arr[i] = Math.max(arr[i], arr[i+1]+1);
}
}
return Arrays.stream(arr).sum();
}
}
十、力扣860. 柠檬水找零
class Solution {
public boolean lemonadeChange(int[] bills) {
boolean flag = false;
int five = 0, ten = 0, twen = 0;
for(int i = 0; i < bills.length; i ++){
switch (bills[i]){
case 5 :
five ++;break;
case 10 :
if(five < 1){
return false;
}
ten ++;
five --;
break;
case 20 :
if(ten >= 1 && five >= 1){
ten --;
five --;
twen ++;
break;
}else if(five >= 3){
five -= 3;
twen ++;
break;
}else{
return false;
}
}
}
return true;
}
}
十一、力扣406. 根据身高重建队列
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(a,b) -> {
if(a[0] == b[0]){
return a[1] - b[1];
}else{
return b[0] - a[0];
}
});
LinkedList<int[]> list = new LinkedList<>();
for(int[] p : people){
list.add(p[1],p);
}
return list.toArray(new int[people.length][2]);
}
}
十二、力扣452. 用最少数量的箭引爆气球
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int n = points.length;
if(n == 1){
return 1;
}
int res = 1, min = points[0][1];
for(int i = 1; i < n; i ++){
if(points[i][0] <= min){
min = Math.min(min, points[i][1]);
}else{
res ++;
min = points[i][1];
}
}
return res;
}
}
十三、力扣435. 无重叠区间
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) ->{
return Integer.compare(a[0],b[0]);
});
int res = 0, count = 1;
if(intervals.length == 1){
return 0;
}
for(int i = 1; i < intervals.length; i ++){
if(intervals[i][0] >= intervals[i-1][1]){
count ++;
}else{
intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
}
}
return intervals.length - count;
}
}
十四、力扣763. 划分字母区间
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> res = new ArrayList<>();
char[] ch = s.toCharArray();
int[] arr = new int[26];
for(int i = 0; i < ch.length; i ++){
arr[ch[i] - 'a'] = i;
}
int idx = 0;
int last = -1;
for(int i = 0; i < ch.length; i ++){
idx = Math.max(idx, arr[ch[i] - 'a']);
if(i == idx){
res.add(i - last);
last = i;
}
}
return res;
}
}
十五、力扣56. 合并区间
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b)->{
return Integer.compare(a[0],b[0]);
});
if(intervals.length == 1){
return intervals;
}
List<int[]> res = new ArrayList<>();
int left = intervals[0][0], right = intervals[0][1];
for(int i = 1; i < intervals.length; i ++){
if(intervals[i][0] <= intervals[i-1][1]){
right = Math.max(right,intervals[i][1]);
intervals[i][1] = Math.max(intervals[i][1], intervals[i-1][1]);
}else{
int[] cur = new int[]{left, right};
res.add(cur);
left = intervals[i][0];
right = intervals[i][1];
}
}
res.add(new int[]{left,right});
return res.toArray(new int[res.size()][]);
}
}
十六、力扣738. 单调递增的数字
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] ch = s.toCharArray();
int start = ch.length;
for(int i = ch.length-2; i >= 0; i --){
if(ch[i] > ch[i+1]){
ch[i]--;
start = i+1;
}
}
for(int i = start; i < ch.length; i ++){
ch[i] = '9';
}
return Integer.parseInt(String.valueOf(ch));
}
}
十七、力扣968. 监控二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minCameraCover(TreeNode root) {
int[] res = fun(root);
return res[0] == 0 ? res[1] + 1 : res[1];
}
// 0 未监控 、 1 已监控 、 2 已安装
public int[] fun(TreeNode root){
if(root == null){
return new int[]{1,0};
}
int[] l = fun(root.left);
int[] r = fun(root.right);
int[] cur = new int[2];
if(l[0] == 0 || r[0] == 0){
cur[0] = 2;
cur[1] = l[1] + r[1] + 1;
}else if(l[0] == 2 || r[0] == 2){
cur[0] = 1;
cur[1] = l[1] + r[1];
}else{
cur[0] = 0;
cur[1] = l[1] + r[1];
}
return cur;
}
}