博主简介:
本博主主要分享C/C++后端方面的技术。
博主的博客主页:CSND博客
Gitee主页:博主的Gitee
博主的稀土掘金:稀土掘金主页
博主的b站账号:程序员乐
若文章有错,请指出
目录
118.杨辉三角
思路
题目的本身的思路并不是很难,就是
i
行j
列的数等于i-1
行j
列的数加上i-1
行j-1
列的数相加的和。
用c语言写的话比较麻烦,需要自己开辟一个二维数组。
用C++就比较舒服了。首先我们开numRows
行,里面的元素类型为vector<int>
。我们用的是vector
里面的resize
resize
表示重新分配多少有用的空间。value_type
为模板实参的类型,表示把比以前多出来的空间初始化为val
。
接下来我们继续更改每个vector<int>
的空间。同时把新增的有用的空间初始为0。同时把第一个和最后一个修改成1。
这里我们用到的是front
和back
。
返回第一个,最后一个的引用。做好这些之后,最后按上面的操作加就可以了。
代码
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv;
vv.resize(numRows);
for(int i=0;i<numRows;++i)
{
vv[i].resize(i+1,0);
vv[i].front()=vv[i].back()=1;
}
for(int i=2;i<numRows;++i)
{
for(int j=1;j<vv[i].size()-1;++j)
{
vv[i][j]=vv[i-1][j]+vv[i-1][j-1];
}
}
return vv;
}
};
26.删除有序数组中的重复项
思路
因为数组中的数是有序的,所以我们用前后指针法。判断前一个数是否和后面的数相等。如果相等,那么后指针继续往后遍历,发现数不同的时候,就把该数覆盖给前指针所指的数。直到遍历完。
代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
size_t a,b;
a=b=0;
for(;b<nums.size();++b)
{
if(nums[a]!=nums[b])
{
nums[++a]=nums[b];
}
}
nums.resize(a+1);
return a+1;
}
};
JZ39数组中出现次数超过一半的数字
思路
我们先假定第一数是众数,我们用众数与数组中的每个数进行比较,如果相等,众数的个数就加一,不等个数就减一。当个数减少到0的时候,就更新众数的数值。直到遍历完数组,得到的就是众数。
代码
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int mode=numbers[0];
int count=1;
for(int i=1;i<numbers.size();++i)
{
if(mode==numbers[i])
++count;
else
{
if(count==0)
{
count=1;
mode=numbers[i];
}
else
--count;
}
}
return mode;
}
};
137.只出现一次的数字II
思路
因为只有一个数出现1次,其余的数字都出现3次,那么我们直接从二进制处理,统计从1到32位中每个数对应二进制1出现的次数,把次数
%3
得到那个只出现一次数对应位的二进制。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int p=0;
int ret=0;
for(int i=0;i<32;++i)
{
p=0;
for(auto x: nums)
{
p+=((x>>i)&1);
}
ret|=(p%3)<<i;
}
return ret;
}
};
136.只出现一次的数字
思路
^
按位异或,两个相同的数按位异或为0,而0和任何一个数按位异或都是那个数。所以把全部的数按位异或即找到了只出现一次的数字。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
for(auto x:nums)
{
ret^=x;
}
return ret;
}
};
260.只出现一次的数字III
思路
把全部数按位异或得到x,此时我们得到的是两个只出现一次的数的按位异或的结果,按位异或有一个特点,相同为0,不同为1。我们根据这个特性,找到x中1的位置i。然后就可以把所有i位置是1的数按位异或就得到其中一个,把全部不是1的按位异或就得到另一个数。
代码
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> v;
v.resize(2);
int x=0;
for(auto i:nums)
{
x^=i;
}
int i=0;
while(i<32)
{
if(x>>i&1==1)
{
break;
}
i++;
}
int a=0,b=0;
for(auto n:nums)
{
if(n>>i&1==1)
a^=n;
else
b^=n;
}
v[0]=a;v[1]=b;
return v;
}
};
17.电话号码的字母组合
思路
每个数字代表的一组字符串,而我们要做的是把不同组字符串中的字符进行组合,而组合的过程可以看作递归的过程。
从第一个数字代表的字符串的第一个字符开始匹配,直到匹配到最后一个数字代表的字符停止。匹配完成之后返回到上一层。
代码
class Solution {
string LetterName[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
void letterCombin(vector<string>& v,string& dig,int i,string temp)
{
if(i==dig.size())
{
v.push_back(temp);
return ;
}
for(auto ch: LetterName[dig[i]-'0'])
{
letterCombin(v,dig,i+1,temp+ch);
}
}
vector<string> letterCombinations(string digits) {
vector<string> vs;
if(digits.size()==0)
return vs;
size_t n=digits.size();
string temp;
letterCombin(vs,digits,0,temp);
return vs;
}
};