zoukankan      html  css  js  c++  java
  • 611. Valid Triangle Number

    问题:

    求给定数组中,每三个值作为三角形三边,可构成三角形的集合个数。

    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].
    

      

    解法:

    先sort整个数组

    i 指向最大边,固定不变

    j 指向第二大边,k 指向最小边。调整 j 和 k

    初始化,i=数组最大值,依次-1,j=i-1,k=0

    若nums[k]+nums[j]<=nums[i],两边之和小于等于第三边,不满足三角形。那么需要扩大 k + j 的和,j已经(除了不能动的i)最大,那么调整 k,k++。

    反之,满足三角形,那么大于当前 k 和 j 的和的所有(当k=k~j-1的所有值+j)都满足,res+=(j-k)。

    接着稍微使得满足条件的 j-- 减小,看看当前 k 是否还能满足。不满足的话增大 k++,同上循环。

    代码参考:

     1 class Solution {
     2 public:
     3     int triangleNumber(vector<int>& nums) {
     4         if(nums.size()<3) return 0;
     5         sort(nums.begin(),nums.end());
     6         int i, j, k;
     7         int res=0;
     8         for(i=nums.size()-1; i>1; i--){
     9             j=i-1;
    10             k=0;
    11             while(k<j){
    12                if(nums[k]+nums[j]<=nums[i]){//not good
    13                    k++;
    14                 }else{
    15                    res+=(j-k);
    16                    j--;
    17                 }
    18             }
    19         }
    20         return res;
    21     }
    22 };
  • 相关阅读:
    关于多态
    关于lock锁
    wait()和notify()
    多线程之间的通讯
    多线程的异步请求模式
    合理配置线程池
    自定义线程池
    Curl的毫秒超时的一个”Bug”
    Nginx正确记录post日志的方法
    NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12631135.html
Copyright © 2011-2022 走看看