leetcode之分糖果JavaScript实现

xiaoxiao2021-02-28  35

问题:给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

输入: candies = [1,1,2,2,3,3] 输出: 3 解析: 一共有三种种类的糖果,每一种都有两个。 最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。 看到这个题,首先想到的是这个是一个去重问题。上一篇讲解过如何去重了。这里不多解释。直接上代码。

        var distributeCandies = function( candies) {         let obj = {};         let count = 0;         candies. forEach( item =>{         if(! obj[ item]){             obj[ item] = 1;             count++;            }          });         return count >= ( candies. length)/ 2 ? ( candies. length)/ 2 : count;        } 好像很简单,当count大于总数的二分之一时,最大为(candies.length)/2;小于时,则为count。不过仔细想想,还是有些问题的。问题在当count大于二分之一时,是没有必要继续遍历整个数组的,因为count的最大值就是数组长度的二分之一。所以代码可以修改为: 方法1:使用every(),因为forEach()跳出循环有点麻烦         var distributeCandies = function( candies) {         let obj = {};         let count = 0;         candies. every( item =>{         if(! obj[ item]){             obj[ item] = 1;             count++;         }         if( count==( candies. length)/ 2){             return false         } else{             return true;             }         });         return count;     }; 方法2:for循环         var distributeCandies = function( candies) {         let obj = {};         let count = 0;         let len = candies. length;         for( var i= 0; i< len; i++){         if(! obj[ candies[ i]]){         obj[ candies[ i]] = 1;             count++;         }         if( count == len/ 2){             break;             }         }         return count;     }; 注意:count等于(candies.length)/2,可以直接跳出循环。 这种方法在count大于二分之一时是不需要遍历整个数组的。 知识补充:在forEach()中,不能使用 continue 和 break ,可以使用 return 或 return false 跳出循环,效果与 for 中 continue 一样。 以上就是我自己的想法啦。大家有什么建议或者更好的方法,欢迎大家积极评论!
转载请注明原文地址: https://www.6miu.com/read-2625173.html

最新回复(0)