zoukankan      html  css  js  c++  java
  • [Algo][July][Homework][lintcode](382)三角形计数

    题目:

    给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?

    例如,给定数组 S = {3,4,6,7},返回 3

    其中我们可以找到的三个三角形为:

    {3,4,6}
    {3,6,7}
    {4,6,7}
    

    给定数组 S = {4,4,4,4}, 返回 4

    其中我们可以找到的三个三角形为:

    {4(1),4(2),4(3)}
    {4(1),4(2),4(4)}
    {4(1),4(3),4(4)}
    {4(2),4(3),4(4)}

    解题思路:

    O(n3)的算法就不赘述了,暴力搜索。

    优化算法:

    首先先对数组排序。

     1 class Solution {
     2 public:
     3     /*
     4      * @param S: A list of integers
     5      * @return: An integer
     6      */
     7     int triangleCount(vector<int> &S) {
     8         // write your code here
     9         int ret = 0;
    10         int iSize = S.size();
    11         if (iSize<=2){
    12             return 0;
    13         }
    14         sort(S.begin(),S.end()); //排序,从小到大排
    15         for (int i = 2; i<iSize; ++i){
    16             int pleft = 0;    //left永远从最小的开始
    17             int pright = i-1; //right从key次大的开始
    18             int key = S[i];
    19             while(pleft<pright){
    20                 if(S[pleft]+S[pright]>key){ //如果相加大于key,那么就再right就再尝试小一点儿的数
    21                     ret += pright - pleft; //如果加下大于key,那么表示比left大的数加right也大于key
    22                     pright--;
    23                 }
    24                 else{  //如果相加小于key,就再尝试left侧大一点儿的数
    25                     pleft++;
    26                 }
    27             }
    28         }
    29         return ret;
    30     }
    31 };
  • 相关阅读:
    《C#微信开发系列(2)-自定义菜单管理》
    《C#微信开发系列(1)-启用开发者模式》
    python多进程: multiprocessing Pool 和tqdm
    前端
    python 缓存
    python pymysql
    python paramiko模块
    Linux之TCPIP内核参数优化
    python进程、线程、协程、IO多路复用
    python socket
  • 原文地址:https://www.cnblogs.com/hopping/p/7715883.html
Copyright © 2011-2022 走看看