leetcode 分饼干问题
题目如下:
注意:第一个数组是孩子的胃口 第二个数组是饼干的个数
思路分析:(以下所描述的思路仅为笔者在刷题过程中的思路,并非最优解,如果想看最优解可移步至:官方解答)
1.将输入的两个数组都进行排序(排序的目的是为了先满足小胃口的孩子,再满足胃口大的孩子)
2.定义一个int类型的值用于返回最后的结果
3.从小到大遍历每个孩子的胃口
4.如果手中最小的饼干可以满足这个孩子的胃口,将这个饼干给孩子,结果+1
4.1 输入手中的饼干数和目前要满足的孩子的胃口
4.2 从小到大遍历手中的饼干,如果满足了孩子的胃口,将饼干数组的这个值设置为-1,返回true 否则返回false
5.循环结束返回结果
具体的代码如下:
1 class Solution { 2 public int findContentChildren(int[] g, int[] s) { 3 //先将孩子的胃口进行排序 4 Arrays.sort(g); 5 Arrays.sort(s); 6 int result = 0; 7 // 遍历每个孩子的胃口 8 for(int i = 0; i < g.length; i++ ){ 9 if(findMath(s,g[i])){ 10 result ++; 11 } 12 } 13 return result; 14 } 15 16 /** 17 * s 数组 18 * matchValue 匹配的值 19 * 输入一个数组 从数组中获取改元素 如果有元素 设置这个元素的值为-1 返回 true 20 * 如果没有 返回false 21 */ 22 private boolean findMath(int[] s,int matchValue){ 23 for(int j=0;j<s.length;j++){ 24 if(matchValue <= s[j]){ 25 s[j] = -1; 26 return true; 27 } 28 } 29 return false; 30 } 31 }
仅仅从顺着笔者思路来看,其实这段代码还有可以优化的地方:
优化点:
1.(见代码12-14行)如果孩子数量特别多,假设有100个 ,但是手里只有10块饼干的情况,进行判断 提前跳出循环
2.(见代码25行)多设置一个参数beginIndex ,实际上相当于假设理想条件,排过顺序之后,如果有一个已经满足了,则就可以从下一个开始循环遍历了。
修改之后可以看到时间明显减少了:
代码如下:
1 class Solution { 2 public int findContentChildren(int[] g, int[] s) { 3 //先将孩子的胃口进行排序 4 Arrays.sort(g); 5 Arrays.sort(s); 6 int result = 0; 7 // 遍历每个孩子的胃口 8 for(int i = 0; i < g.length; i++ ){ 9 if(findMath(s,g[i],i)){ 10 result ++; 11 } 12 if(i>s.length){ 13 break; 14 } 15 } 16 return result; 17 } 18 19 /** 20 * s 数组 21 * matchValue 匹配的值 22 * 输入一个数组 从数组中获取改元素 如果有元素 设置这个元素的值为-1 返回 true 23 * 如果没有 返回false 24 */ 25 private boolean findMath(int[] s,int matchValue,int beginIndex){ 26 for(int j=beginIndex;j<s.length;j++){ 27 if(matchValue <= s[j]){ 28 s[j] = -1; 29 return true; 30 } 31 } 32 return false; 33 } 34 }