• 数组中三个数和为零


    前面看到的问题是数组A中,和为固定值sum的两个数。我们一般的做法是先给数组排序,然后数组前后各有一个下标i、j,如果A[i]+A[j]>sum,则j--,如果A[i]+A[j]<sum,则i++;否则输出A[i]、A[j]。

    有一个类似的扩展问题就是:找到一个是数组中和为零的三个数,一般的解决方法也是设置三个下标变量,i,j和k。每次固定i,然后寻找满足条件的j 和k ;并且需要满足i<j<k。

    如果条件是这三个数不能重复,C++实现的过程可以借助于set容器(set容器可以去掉数组中重复的数字),具体实现方法如下:

     1 vector<int> FindSumZeroNum(vector<int> A)
     2 {
     3     set<vector<int>>ret;
     4     vector<int>temp;
     5     int n = A.size();
     6         for(int i =0 ;i < n;i++)
     7        {
     8           ret.insert(A[i]);
     9         }
    10         vector<int>B;
    11         set<vector<int>>::iterator it1 = ret.begin();
    12         set<vector<int>>::iterator it2 = ret.end();
    13         for(;it1!=it2;it1++)
    14        {
    15           b.push_back(*it1);
    16        }        
    17 
    18     for (int i = 0; i < n; i++)
    19     {
    20         int j = i + 1;
    21         int k = n - 1;
    22         while (j < k)
    23         {
    24             int sum_two = B[i] + B[j];
    25             if (sum_two + B[k] < 0)
    26                 j++;
    27             else if (sum_two + B[k] > 0)
    28                 k--;
    29             else
    30             {
    31                 temp[0] = B[i];
    32                 temp[1] = B[j];
    33                 temp[2] = B[k];
    34                 j++;
    35                 k--;
    36             }
    37         }
    38     }
    39     return temp;
    40 }

    该方法并不是此问题最好的解决方案,因为用到了很多STL模板中的容器,只是想进一步学习除了map,vector之外的其他容器的更多使用方法;补充一点基础知识,方便自己以后学习:

    1)set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序(set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值)。

    2)应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树

    3)想要从set中取出指定位置的元素,

    set转成list可以解决

    List <A> list = new ArrayList<A>(B);//B是set型的

    取的时候只要这样

    list.get(0);

    参考内容:
    https://blog.csdn.net/u010732356/article/details/68926478
    https://www.cnblogs.com/caiyishuai/p/8646345.html
    https://www.cnblogs.com/omelet/p/6627667.html
    没有诗和远方 只有代码和当下
  • 相关阅读:
    WMware下的Linux系统安装VMtools
    VMware虚拟机安装Ubuntu图文攻略
    Python高级编程(三)
    Python高级编程(二)
    Python高级编程(一)
    纯div+css样式弹出泡泡消息框
    EF应用CodeFirst模式,数据迁移的基本用法要点摘记
    sql左连接的误区
    ExtJs,从开始接触到如今,我都觉得你好垃圾阿。。。。
    EntityFramework经典的left join语法
  • 原文地址:https://www.cnblogs.com/ArleneZhangfj/p/10000098.html
Copyright © 2020-2023  润新知