• 611. Valid Triangle Number (solution 2)


    package LeetCode_611
    
    /**
     * 611. Valid Triangle Number
     * https://leetcode.com/problems/valid-triangle-number/
     * Given an array consists of non-negative integers,
     * your task is to count the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
    Example 1:
    Input: [2,2,3,4]
    Output: 3
    Explanation:
    Valid combinations are:
    2,3,4 (using the first 2)
    2,3,4 (using the second 2)
    2,2,3
    Note:
    The length of the given array won't exceed 1000.
    The integers in the given array are in the range of [0, 1000].
     * */
    class Solution {
        /*
        Because Triangle is the sum of any two sides must be greater than third sides (任意两条边之和要大于第三边),
        we need to find 3 numbers,i<j<k and nums[i]+nums[j]>nums[k];
          Solution 1: sort array, bruce force, Time:O(n^3), Space:O(1);
        * Solution 2: sort array, two pointer, Time:O(n^2), Space:O(1);
        * */
        fun triangleNumber(nums: IntArray): Int {
            if (nums == null || nums.isEmpty() || nums.size < 2) {
                return 0
            }
            var count = 0
            nums.sort()
            //solution 2
            for (i in nums.indices) {
                var left = 0
                var right = i - 1
                while (left < right) {
                    if (nums[left] + nums[right] > nums[i]) {
                        /*
                       * for example array is :1,2,.,..5; if 1,2,5 is valid triplets, because array is sorted,
                       * so the element at the left of 5(right pointer) and at the right of 2(left pointer) are all valid.
                       * */
                        count += right - left
                        right--
                    } else {
                        left++
                    }
                }
            }
            return count
        }
    }
  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14060670.html
Copyright © 2020-2023  润新知