《巧用 vector 解析 OJ 经典算法:从异或寻数到杨辉三角》

🔥个人主页:K 旺仔小馒头
🍉学习方向:C/C++方向学习者
📖个人专栏:《C语言》《数据结构与算法》《C++知识分享》《C语言实战编程》《算法题从优选到贪心的解题技巧》
⭐️人生格言:“何时葡萄先熟透,你要静候再静候”

前言:
在算法刷题与 OJ 实战中,vector 是 C++ 开发者的核心工具之一。它兼具数组的高效访问与动态扩容的灵活性,成为实现复杂数据结构、优化算法逻辑的关键载体。本文解析的异或找唯一数、生成杨辉三角两题,便借助 vector 实现了简洁高效的解法,既凸显算法特性,也展现了 vector 在 OJ 场景下的实用价值。
一. 只出现一次的数字【难度:简单】
描述:
给你一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
解析:
异或^ 就可以解决这个问题
class Solution {
public:int singleNumber(vector<int>& nums) {int value = 0;for(auto e : nums){value ^= e;}return value;}
};
二. 杨辉三角【难度:简单】
描述:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
解析:
1. 涉及resize / operator[]
2. 核心思想:找出杨辉三角的规律,发现每一行头尾都是1,中间第[ j ]个数等于上一行[ j-1 ]+ [ j ]
class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;//行vv.resize(numRows,vector<int>());//列for(size_t i = 0; i < numRows; i++){vv[i].resize(i+1,1);}for(size_t i = 2; i < vv.size(); i++){for(size_t j = 1; j < vv[i].size()-1; j++){vv[i][j] = vv[i-1][j-1] + vv[i-1][j];}}return vv;}
};
结尾:
往期精选:
《string 类模拟实现(收尾):传统与现代写法对比及底层机制探析》
《C++ vector核心接口全解:从构造到增删查改,一篇掌握所有常用操作》
《vector 底层模拟实现(上):核心机制全解析 + 迭代器失效深度剖析》
结语:两题的求解的过程,充分印证了 vector 在 OJ 中的适配性与优势。它简化了数据存储与访问逻辑,让开发者能聚焦算法核心规律,无需冗余处理内存分配问题。掌握 vector 的灵活运用,是提升 OJ 解题效率、优化代码质量的重要基础,为应对更复杂的算法挑战筑牢根基。


