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 }
View Code

 仅仅从顺着笔者思路来看,其实这段代码还有可以优化的地方:

优化点:

    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 }
原文地址:https://www.cnblogs.com/cswxl/p/12712572.html