zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    asp.net core过滤器记录响应对象
    ef core实现无感知软删除
    Egret资源跨域问题
    ASP.Net Core中使用jquery-ajax-unobtrusive替换Ajax.BeginForm
    把.Net开发环境迁移到Linux上去
    Mysql8.0升级后,Navicat连接报错caching_sha2_password 问题
    改MySQL的编码方式,解决jdbc MySQL中文乱码问题
    怡红公子专属网址导航
    html以前没有学到的标签
    有哪些质量上乘的程序员必关注的网站或论坛
  • 原文地址:https://www.cnblogs.com/cswxl/p/12712572.html
Copyright © 2011-2022 走看看