• 【LeetCode】Letter Combinations of a Phone Number


    给定一个数字字符串,根据如下图的电话,返回这串数字所有可能的字母组合。

    e.g. 输入:"23"

           输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

     1 vector<string> letterCombinations(string digits) {
     2     if (digits.empty()) return {};
     3     vector<string> result = {""};
     4     vector<string> phone = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
     5     for (int i = 0; i < digits.size(); i++) {
     6         vector<string> temp;
     7         string str = phone[digits[i] - '0'];
     8         for (int j = 0; j < str.size(); j++) {
     9             for (int k = 0; k < result.size(); k++) {
    10                 temp.push_back(result[k] + str[j]);
    11             }
    12         }
    13         result = temp;
    14     }
    15     return result;
    16 }

    上面代码有个更高效的方法,将第13行改写为 

    result.swap(temp);

    vector的swap成员函数仅仅是交换了指向的首尾指针和容量指针,时间复杂度是常数,并且没有内存的复制,提高了代码效率。

    1 void swap(vector<_Tp, _Alloc>& __x) {  
    2     __STD::swap(_M_start, __x._M_start);  
    3     __STD::swap(_M_finish, __x._M_finish);  
    4     __STD::swap(_M_end_of_storage, __x._M_end_of_storage);  
    5 }

    vector内存占用的空间是只增不减的,所有内存空间在vector析构时回收。

    比如说首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。

    clear()可以清空所有元素,但它仅使vector的大小减少至0,所占用的内存空间依然如故。

    使用swap释放内存的用法主要是:

    vector(v).swap(v);    // 将v的内存空洞清除
    vector().swap(v);    // 清空v

    这样释放内存的主要思想是:vector()使用vector的默认构造函数建立临时vector对象,再在该临时对象上调用swap成员,swap调用之后对象v占用的空间就等于一个默认构造的对象的大小,临时对象就具有原来对象v的大小,而该临时对象随即就会被析构,从而其占用的空间也被释放。

    e.g.

     1 main() {
     2     vector v;
     3     v.push_back(1);
     4     v.push_back(2);
     5     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
     6     v.erase(v.begin());
     7     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
     8     vector(v).swap(v); // 最小化v的容量
     9     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
    10 }

    输出结果为:

    v size = 2 v capacity = 2
    v size = 1 v capacity = 2
    v size = 1 v capacity = 1

    如果需要内存空间动态缩小并且不是必须使用vector,可以考虑使用deque。

  • 相关阅读:
    双态运维分享之:业务场景驱动的服务型CMDB
    双态运维分享之二: 服务型CMDB的消费场景
    双态运维:如何让CMDB配置维护更贴近人性
    CMDB经验分享之 – 剖析CMDB的设计过程
    APM最佳实践: 诊断平安城市视频网性能问题
    先定一个运维小目标,比方监控它10000台主机
    大规模Docker平台自动化监控之路
    少走冤枉路!带你走过SNMP的那些坑
    完整性约束
    数据类型
  • 原文地址:https://www.cnblogs.com/wayne793377164/p/7086041.html
Copyright © 2020-2023  润新知