vector——练习题

1. 杨辉三角

杨辉三角

在这里插入图片描述
在这里插入图片描述

C:二维数组要动态开辟
C++:二维数组用vector就行

class Solution{
    public:
         vector<vector<int>> generate(int numRows){
        vector<vector<int>> vv;
        //需要初始化所以用resize
        vv.resize(numRows);
        for (size_t i = 0; i < vv.size(); ++i)
        {
            //头尾给1,其他给0
            
            vv[i].resize(i+1,0);    
            vv[i].front() = vv[i].back() = 1;    
        }
        
        //用下标访问
        for (size_t i = 0; i < vv.size(); ++i)
        {
            for (size_t j = 0; j< vv[i].size(); ++j)
            {
                if (vv[i][j] == 0)
                {
                    vv[i][j] = vv[i-1][j] + vv[i-1][j-1];
                                    
                }            
            }        
        }
        return vv;
        }
        
};

两层嵌套
vector<vector> vv
vv[i][j] -> vv.operator[i]
第一层调用是vv[i],vv.operator[i]返回值是vector
第二层调用vv[i][j],vector.operator[j]返回值是int

 
 

2. 删除有序数组中的重复项

题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
 
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
 
将最终结果插入 nums 的前 k 个位置后返回 k 。
 
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

链接力扣(LeetCode)

思路
C
通过挪动数据
dst与src对比相等src就++
遇到不相等了就先++dst再将src赋值过去
返回数组新长度就是 return dst+1

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
    int src = 0,dst = 0;
    while(src < nums.size())
    {
        if(nums[src] == nums[dst])
        {
            ++src;        
        }
        else
        {
            nums[++dst] = nums[src++];        
        }    
    }
    nums.resize(dst+1);
    return dst+1;
    }
};

不需要返回值的情况,要将dst之后的数据都删掉
nums.resize(dst+1);

 
 

3.电话号码的字母组合

电话号码的字母组合
在这里插入图片描述

深度优先遍历
数字映射对应的字符串(固定的)

class Solution {
    char* numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    //string numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
    //给个子函数进行递归
    void Combine(string digits,int di, vector<string>& retV, string combineStr)
    {
        if(di == digits.size())
        {
            retV.push_back(combineStr);
            return;        
        }    
        //取数字字符映射字符串
        int num = digits[di] - '0';
        string str = numToStr[num];
        for(auto ch : str)
        {
            Combine(digits, di+1, retV, combineStr+ch);        
        }
    }
    vector<string> letterCombinations(string digits) {
       vector<string> v;
       if(digits.empty())
       return v;
       
       string str;
       Combine(digits, 0, v, str);
       
       return v;
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值