136-只出现一次的数字
给定一个非空整形数组,除了讴歌元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。
示例:输入[2,2,1],输出:1
class solution
{
public:
int getSingleNamu(std::vector<int> &nums)
{
int res = 0;
for(int i:i<nums.size();i++) {
res ^ = nums[i];
}
return res;
}
};
70-爬楼梯
假设你正在爬楼梯,需要n阶你才能到达楼顶。每次你可以爬1或2个台阶,你有多种不同的方法爬到楼顶呢?
关键思想:要到达第n阶,最后一步只能是以下两种方式之一:
- 从第n-1阶爬1阶上来
- 从第n-2阶爬2阶上来
假设爬4: 第4阶的所有方法 = (所有到达第3阶的方法,然后爬1阶) + (所有到达第2阶的方法,然后爬2阶)
因为爬楼梯的选择具有无后效性:无论前面怎么爬,最后一步的选择只取决于当前所在的位置,与之前的具体路径无关。
换句话说:
- 所有到达n阶的方法 = 所有"以爬1阶结束"的方法 + 所有"以爬2阶结束"的方法
- "以爬1阶结束"的方法数 = 到达n-1阶的方法数
- "以爬2阶结束"的方法数 = 到达n-2阶的方法数
class solution {
int climbStaires(int n) {
if(n == 1)
return 1;
if(n == 2)
return 2;
int res = climbStaires(n - 1) + climbStaires(n-2);
return res;
}
};
//优化后:
class solution {
std::underedmap<int,int> resMap;
int climbStaires(int n) {
if(n==1)
return 1;
if(n==2)
return 2;
/*
错误
auto it = resMap.find(n-1);
int res1 = 0;
int res2 = 0;
if( it != resMap.end()) {
res1 = it->second;
}else {
resMap[n] = climbStaires(n-1);
}
it = resMap.find(n-2);
if( it != resMap.end()) {
res1 = it->second;
}else {
resMap[n] = climbStaires(n-2);
}
return res1 + res2;
*/
auto it = resMap.find(n);
if( it != resMap.end()) {
return it->second;
}else {
int res = climbStaires(n-1) + climbStaires(n-2);
resMap[n] = res;
return res;
}
}
};
1-两数之和
给定一个整形数组和一个整数目标值target,请你在该数组中找出和目标值taraget那两个整数,并返回它们的数组下标。你可以假设每一组输入只会对应一个答案。
输入:nums=[2,7,11,15],target = 9;输出[0,1]
class solution {
vector<int> getSum(vector<int> &nums,int target) {
vector<int> vec;
undered_map<int,int> map;
for(int i = 0;i<nums.size();i++) {
auto it = map.find(target - nums[i]);
if(it == map.end()){
map[target-nums[i]) = i;
continue;
}else{
vec.push(i);
vec.push(map[target - nums[i]);
break;
}
}
return vec;
}
};
合并两个有序数组
若给你两个非递减顺序排列的整数数组num1和num2,另有两个整数m和n,分别表示num1和num2中的元素。请你合并num2和num1中,合并后的数组仍非递减顺序排列。合并后存储在数组num1中,num1的初始长度为m+n
输入:num1=[1,2,3,0,0,0],num2=[2,5,6],m=3,n=3
输出:[1,2,2,3,5,6]
class solution
{
public:
void merge(vector<int>& num1,m,vector<int>& num2,n)
{
int i = m - 1;//num1有效元素的最后一个位置
int j = n - 1;//num2最后一个位置
int k = m+n-1;//num1最后一个位置
while(i >= 0 && j >=0) {
if(num1[i]>num2[j--]){
num1[k--]=num1[j]
}else{
num1[k--]=num2[i--];
}
}
//[3,4,7,0,0], [1,2]
while(j>=0)//如果nums2还有剩余元素,直接复制到nums1前面
{
num1[k--]=num2[j--];
}
// 如果nums1还有剩余元素,它们已经在正确的位置,无需处理
}
};
移动0
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
输入:[0,1,0,3,12],输出:[1,3,12,0,0,0]
void sortZero(std::vector<int> &nums) {
int left = 0;
for(int i = 0;i<nums.size();i++) {
if(nums[i] != 0) {//将所有非零元素移动到前面
nums[left++] = nums[i];
}
}
for(int i = left;i < nums.size();i++) {
nums[i] = 0;//剩余位置为0
}
}
448-找到所有数组中消失的数字
给你一个含n个整数的数组nums,其中nums[i]在区间{1,n}内,请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。
输入:[4,3,2,7,1],输出:[5,6]