leetcode 贪心_LeetCode 贪心篇(455、55)

455. 分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

注意:

你可以假设胃口值为正。

一个小朋友最多只能拥有一块饼干。

示例 1:

输入: [1,2,3], [1,1]

输出: 1

解释:

你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。

虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。

所以你应该输出1。

示例 2:

输入: [1,2], [1,2,3]

输出: 2

解释:

你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。

你拥有的饼干数量和尺寸都足以让所有孩子满足。

所以你应该输出2.

solution1

//小饼干尽量满足胃口小的小朋友,让大饼干可以给胃口大的,达到满足最多小朋友的目的

数组排序 Arrays.sort(arr)wanqian

class Solution {

public int findContentChildren(int[] g, int[] s) {

int i = 0, j = 0, res = 0;

Arrays.sort(g);

Arrays.sort(s);

while (i < g.length && j < s.length){

if (g[i]<=s[j]){

i ++;

res ++;

}

j ++;

}

return res;

}

}

55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]

输出: true

解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]

输出: false

解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

思路

//思路1:如果一个位置能够到达,那么这个位置左侧所有位置都能到达

//思路2:整一个数组进行记录每一格,两层遍历对每一格能否到达进行判断

//思路3:贪心,假设都能抵达,从最后一格往前模拟

solution 1 贪心

class Solution {

public boolean canJump(int[] nums) {

if(nums == null) return false;

int end = nums.length - 1;

for (int i=nums.length-1; i>=0; i--){

if (nums[i]+i >= end) end = i; //不断往前遍历,需要的end越小

}

return end == 0;

}

}

solution2 双层遍历

//时间复杂度为O(n^2)

class Solution {

public boolean canJump(int[] nums) {

boolean[] res = new boolean[nums.length];

res[0] = true;

for (int i=0; i

if (res[i]){

for (int j=0; j<=nums[i]; j++) {

if (i+j > nums.length-1) break;

res[i+j] = true;

}

}

if (res[nums.length-1] == true) break;

}

return res[nums.length-1];

}

}

class Solution {

public boolean canJump(int[] nums) {

int max = 0;

for (int i=0; i

//判断当前i是否打过了最大值

if (i>max) return false;

//不断扩大最大值

max = Math.max(max,i+nums[i]);

}

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值