这个目录里的题目,计划是每两天用C++解一道题。这么多年,一直没把C++捡起来,今年有点改变吧。
只出现一次的数字
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> s;
int res;
for(auto i:nums){
if(s.count(i)){
s.erase(i);
}else{
s.insert(i);
}
}
res = *s.begin();
return res;
}
};
多数元素
学习vector的用法
class Solution {
public:
int majorityElement(vector<int>& nums) {
int target = nums[0];
int count = 1;
for(int i=0;i<nums.size();i++){
if(nums[i]!=target){
count--;
if(count==0){
target = nums[i];
count = 1;
}
}else{
count++;
}
}
return target;
}
};
搜索二维矩阵 II
从左下往右上遍历
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size() <= 0||matrix[0].size() <= 0){
return false;
}
int m = matrix.size() ;
int n = matrix[0].size();
int i= m-1;
int j = 0;
while(i>=0 && j<=n-1){
if(matrix[i][j]==target){
return true;
}else if(matrix[i][j]>target){
i--;
}else{
j++;
}
}
return false;
}
};
合并两个有序数组
从大的数开始比较
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1;
int j=n-1;
int right = m+n-1;
//第一种情况:当nums1先结束之后
//第二种情况:当nums2先结束之后
//第三种情况:当nums1和nums2都还没有结束时
//第3种情况,从后面开始比较,选择两者大的数
while(i>=0 && j>=0){
if(nums1[i]>nums2[j]){
nums1[right] = nums1[i];
i--;
}else{
nums1[right] = nums2[j];
j--;
}
right--;
}
//第2种情况:nums2先结束,则无需再做处理,保持nums1前面未动的地方不变即可。
//第1种情况,将nums2未Merge的队列放到nums1的前面
while(j>=0){
nums1[right] = nums2[j];
j--;
right--;
}
}
};
鸡蛋掉落
难:审题,注意题目中,鸡蛋个数的作用
参考:参考博文
class Solution {
public:
int superEggDrop(int K, int N) {
int remainTestCount = 1;
while(getConfirmFloors(remainTestCount,K)<N){
remainTestCount++;
}
return remainTestCount;
}
int getConfirmFloors(int remainTestCount,int remainEggs){
if(remainTestCount==1 || remainEggs==1){
//只能一层一层地从下往上扔,扔的次数取决于可测试次数,能扔多少次,可以确认多少层楼
return remainTestCount;
}
return getConfirmFloors(remainTestCount-1,remainEggs-1)+1+getConfirmFloors(remainTestCount-1,remainEggs);
}
};