[LeetCode] 135. Candy java

来源:互联网 发布:embed js控制声音大小 编辑:程序博客网 时间:2024/05/16 01:24
    /**135. Candy     * @param ratings     * @return     */    public int candy(int[] ratings) {        int len = ratings.length;        if (len == 0)            return 0;        int[] left = new int[len];        int[] right = new int[len];        left[0] = 1;        for (int i=1; i<len; i++) {            if (ratings[i] > ratings[i-1])                left[i] = left[i-1]+1;            else                left[i] = 1;        }        right[len-1] = left[len-1];        for (int i=len-2; i>=0; i--) {            if (ratings[i] > ratings[i+1])                 right[i] = right[i-1]+1;            else                 right[i] = 1;        }        int sum = 0;        for (int i=0; i<len; i++) {            sum += (left[i]>right[i])? left[i]: right[i];        }        return sum;    }

这道题和Trapping water那个是一样的想法,因为无论是水坑还是得到糖的小朋友,影响因素都不只一边,都是左右两边的最小值/最大值来决定的。
所以这道题跟上一道一样,也是左右两边遍历数组。
left数组存从左边遍历,当前小朋友对比其左边小朋友,他能拿到糖的数量;
right数组存从右边遍历,当前小朋友对比其右边小朋友,他能拿到的糖的数量。
最后针对这两个数组,每个小朋友能拿到的糖的数量就是这两个数最大的那个数,求总加和就好了。

稍稍改进一下,在遍历right时直接求和

    public int candy(int[] ratings) {        int len = ratings.length;        if (len == 0) {            return 0;        }        int[] nums = new int[len];        nums[0] = 1;        for (int i = 1; i < len; i++) {            if(ratings[i] > ratings[i-1]) {                nums[i] = nums[i-1] + 1;            } else {                nums[i] = 1;            }        }        int res = nums[len-1];        for (int i = len-2; i >= 0; i--) {            int cur = 1;              if(ratings[i]>ratings[i+1])              {                  cur = nums[i+1]+1;              }              res += Math.max(cur,nums[i]);              nums[i] = cur;         }        return res;    }
0 0
原创粉丝点击