题解 | #分糖果问题#

分糖果问题

http://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352

解题思路就是把数组切割成 N 个倒叙数组。然后再处理,具体看下面代码注释

/**
 * pick candy
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function candy( arr ) {
    // write code here
    var num = 0, //最少分的糖果
        disList=[], //存每个得分分到的糖果
        arrb = []; //把arr 得分分割成N 个倒叙排列的数组,存到arrb;
    for(i=0;i<arr.length;i++){
        if(i== 0){
            arrb.push([]);
        }
        if(arr[i] > arr[i+1]){
            arrb[arrb.length-1].push(arr[i]);
        }else {
            arrb[arrb.length-1].push(arr[i]);
            arrb[arrb.length] = [];
        }
    };
    for(i=0;i<arrb.length; i++){
        let dis = arrb[i].length; //每一组倒序数组每次要分的糖果最高数量
      //由于切割数组时候有些倒叙数组只有一个值,所以需要判断前当前最高分的数量是否小于前一个数组的最低数量
        if(disList[disList.length - 1] && dis <= disList[disList.length - 1] ){
            if(arrb[i][0] > arrb[i-1][arrb[i-1].length -1] ) {
                dis = disList[disList.length - 1] + 1;
            }
        }
        //开始分糖果,当分糖果第一个分到 dis 数量的也就是最多的糖果。分完第一个第二个分的数量不能是dis-1 需要变成当前倒叙列的长度 -1;这样处理分到最后一个就会只分1个。得到这一组倒叙的分的最少苹果的
        for(k=0;k<arrb[i].length;k++){
            if(k == 0){
                num += dis;
                disList.push(dis);
                dis = arrb[i].length - 1; 
            }else {
                num += dis;
                disList.push(dis);
                dis -= 1;
            }
            
        } 
    }
    return num;
}
module.exports = {
    candy : candy
};
全部评论

相关推荐

01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务