2022/12/4
题目(完成):1.两数之和
我的解答:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int nums_len=end(nums)-begin(nums);
int i,j;
int result_sum;
int result_numpy[2];
for(i=0;i<nums_len;i++)
{
for(j=0;j<nums_len;j++)
{
result_sum=nums[i]+nums[j];
if(result_sum==target&&i!=j){
result_numpy[0]=i;
result_numpy[0]=j;
return {i,j};
}
}
}
return {i,j};
}
};
经验:
1.求数组长度:
int nums_len=end(nums)-begin(nums)
2.嵌套for循环
3.定义数组:
int numpy1[5] = { 0,1,2,3,4 } //注意数组的表达形式{}
2022/12/5
题目(未做出)26:删除有序数组中的重复项
我的解答(二刷):
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i=1;
int j=1;
while(i<nums.size()){
if(nums[j]!=nums[i-1]){
i++;
j++;
}
else{
j++;
if(nums[i-1]!=nums[j]){
nums[i]=nums[j];
i++;
j=i;
}
}
}
return i;
}
};
答案解答(思维有进步,但是还不够)
class Solution {
public:
// j
// i
// 0 1 2 1 2 2 3 4
int removeDuplicates(vector<int>& nums) {
int i = 1, j = 1;
while(j < nums.size())
{
if(nums[i - 1] != nums[j])
{
nums[i] = nums[j];
++i;
}
++j;
}
return i;
}
};
三刷做的答案和第一次做的答案一模一样 真服了
2022/12/6
题目(做出一半):27.移除元素
我的解答:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i;
int j;
int k;
for(i=0;i<(nums.size())/2;i++){
if(nums[i]==val){
for(j=nums.size()-1;j>=(nums.size())/2;j--){
if(nums[j]!=val){
k=nums[i];
nums[i]=nums[j];
nums[j]=k;
break;
}
}
}
}
return i;
}
};
经验:
我的思路是用双指针分别从左右遍历,答案有相同的思路,但是我写的不太好。
第二次解答 依托答辩
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i,j=1;
int a=0;
while(j<nums.size()){
if(nums[i-1]!=val){
i++;
j++;
}
else{
j++;
if(nums[j]!=val){
a=nums[i-1];
nums[i-1]=nums[j];
nums[j]=a;
i++;
j=i;
}
}
}
return i;
}
};
非常简单直接的解题思路
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i;
int j=0;
for(i=0;i<nums.size();i++){
if(nums[i]!=val){
nums[j]=nums[i];
j++;
}
}
return j;
}
};
2022/12/7
题目(未做出):35.搜索插入位置
题目中若要求算法的时间复杂度是O(logn),那么这个算法基本上就是二分法。
我的解答:超时 第二次
我的解答
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int i=0;
int a;
while(i<nums.size()){
if(nums[i]<=target&&target<=nums[i+1]){
if(nums[i]==target){
a=i;
}
else if(nums[i+1]==target){
a=i+1;
}
else{
a=i+1;
}
}
else{
i++;
}
}
return a;
}
};
答案
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
int mid = 0;
while(left <= right){
mid = left + (right - left)/2;
if(nums[mid] == target){
return mid;
}
if(nums[mid] >target){
right = mid-1;
}
else{
left = mid+1;
}
}
return left;
}
};
2022/12/8
题目(基本完成):66.加一
我的解答
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int length=digits.size()-1;
digits[length]++;
int i=digits.size()-1;
while(i>0){
if(digits[i]==10){
digits[i]=0;
digits[i-1]++;
}
i--;
}
if(digits[0]==10){
vector<int>ans(digits.size()+1);
ans[0]=1;
return ans;
}
return digits;
}
};
经验:
可以自己定义一个新的数组并返回;定义一个全为0的数组:
vector<int>ans(digits.size()+1);
二刷 和第一遍做的一模一样 服了 一点进步没有啊
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int i = digits.size() - 1;
digits[i]++;
while(i>=0){
if(digits[i]==10){
digits[i]=0;
digits[i-1]++;
}
i--;
}
return digits;
}
};
2022/12/9
题目(超时):88.合并两个有序数组
我的解答
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i;
int j=0;
for(i=m;i<m+n;i++){
nums1[i]=nums2[j];
j++;
}
int k=m+n;
int i_1;
int j_1;
int test;
int times=0;
while(k>2){
for(i_1=0;i_1<k;i_1++){
for(j_1=0;j_1<k;j_1++){
if(nums1[i_1]>=nums1[j_1]){
times++;
}
if(times==k){
test=nums1[i_1];
nums1[i_1]=nums1[k-1];
nums1[k-1]=test;
k--;
// i_1=0;
// j_1=0;
}
}
}
}
}
};
答案
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int r=nums1.size();
while(n>0){
if(m>0&&nums1[m-1]>nums2[n-1]){
nums1[r-1]=nums1[m-1];
m--;
r--;
}
else{
nums1[r-1]=nums2[n-1];
n--;
r--;
}
}
}
};
经验:
1.感觉自己写的逻辑上应该没问题,但是超时了。
2.因为两个数组都是非递减顺序的,所以从后往前比较两个数组的值大小然后插入。
二刷 未作出 还不如第一次 好歹还有点思路
2022/12/10
题目(未做出):118.杨辉三角
答案
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>>nums(numRows);
int i;
int j;
int m;
for(i=0;i<numRows;i++){
nums[i].resize(i+1);
nums[i][i]=1;
nums[i][0]=1;
}
for(m=2;m<numRows;m++){
for(j=1;j<m;j++){
nums[m][j]=nums[m-1][j-1]+nums[m-1][j];
}
}
return nums;
}
};
经验:
1.nums.resize()
2.nums[i][j]
2023/2/15
题目(我感觉没问题,但是答案也没有类似的解答):136.只出现一次的数字
我的解答
class Solution {
public:
int singleNumber(vector<int>& nums) {
int i,j;
int times=0;
int a=0;
for(i=0;i<nums.size();i++){
for(j=0;j<nums.size();j++){
if(nums[i]==nums[j]){
times++;
}
}
if(times==1){
return nums[i];
}
}
return 0;
}
};
异或运算有两种特性:
- x ^ x = 0,任意相同数字 x 异或的结果为 0;
- x ^ 0 = x,任意非零数字与 0 异或的结果为其本身。
- 异或运算满足交换律和结合律。
2023/3/27
题目(未做出)121:买卖股票的最佳时机
参考答案
class Solution {
public:
int maxProfit(vector<int>& prices) {
int cost=INT_MAX,profit=0;
for(int price : prices){
cost=min(cost,price);
profit=max(profit,price-cost);
}
return profit;
}
};
2023/3/29
题目(完成)169:多数元素
sort(nums.begin(),nums.end());
题目(完成)217:存在重复元素
参考答案
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); i++)
if (nums[i-1] == nums[i]) return true;
return false;
}
};
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> set;
for (int num: nums) {
if (set.find(num) != set.end()) return true;
set.insert(num);
}
return false;
}
};
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
if(nums.size() <= 1) return false;
unordered_map<int,int> map;
for(int num : nums) {
map[num]++;
if(map[num] >= 2) return true;
}
return false;
}
};
unordered_set find(key):查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器
2023/3/30
题目(未完成)219:存在重复元素2
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
if(!map.empty() && map.count(nums[i])>0){
if(i-map[nums[i]]<=k){
return true;
}
}
map[nums[i]]=i;
}
return false;
}
};
map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在(当然也可以使用find()方法判断键值是否存在)。
2023/4/2
题目(思路正确,做出来一半)228:汇总区间
我的解答
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string>ans;
int i=1;
int j=1;
string s;
while(j<nums.size()){
if(nums[j]-nums[i-1]>1){
s = to_string(nums[i-1]);
ans.push_back(s);
i++;
j++;
}
else{
if(j==nums.size()-1){
s=to_string(nums[i-1]) + "->" + to_string(nums[j]);
ans.push_back(s);
}
int times = 1;
j++;
if(nums[j]-nums[i]==times){
j++;
times++;
}
if(nums[j]-nums[i]>times){
// map[k]="nums[i-1],nums[j-1]]";
// s += to_string(nums[l]) + "->" + to_string(nums[r - 1]);
s=to_string(nums[i-1]) + "->" + to_string(nums[j-1]);
ans.push_back(s);
if(j==nums.size()-1){
s=to_string(nums[j]);
ans.push_back(s);
}
i=j+1;
j=i;
}
}
}
return ans;
}
};
// s = to_string(nums[l]);
// ans.push_back(s);
答案
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
int n = nums.size();
vector<string> ans;
if(n == 0) {
return {};
}//nums是个空数组
int l = 0;
while(l < n) {
string s;
int r = l + 1;
if(r == n) { //mums数组中只有一个元素
s = to_string(nums[l]);
ans.push_back(s);
break;
}
while(r < n && nums[r] == nums[r - 1] + 1) {
++r;
}
if(r == l + 1) {
s = to_string(nums[l]);
}
if(r > l + 1) {
s += to_string(nums[l]) + "->" + to_string(nums[r - 1]);
}
l = r;
ans.push_back(s);
}
return ans;
}
};
push_back()函数将一个新元素加到vector的最后,位置为当前最后一个元素的下一个元素
2023/4/3
题目(完成)268:消失的数字
我的解答
我的解答
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
int r = 0;
if(nums[0]!=0){
return r;
}
if(n == r + 1){
return r+1;
}
while((r+1<n) && nums[r+1] == nums[r] + 1){
r++;
}
return r+1;
}
};
2023/4/4
题目(完成)283:移动零
暴力解法
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int times=0;
int j = 0;
// if(nums.size()==0){
// return nums
// }
for(int i=0;i<nums.size();i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++;
times++;
}
}
for(times;times<nums.size();times++){
nums[times]=0;
}
// return nums;
}
};
双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 1;
int right = 1;
while(right<nums.size()){
if(nums[left - 1]== 0){
if(nums[right]!=0){
nums[left-1]=nums[right];
nums[right]=0;
left++;
right=left;
}
else{
right++;
}
}
else{
left++;
right++;
}
}
}
};
答案
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int leftIndex = 0;
int rightIndex = 0;
/**
* 还是两个指针,如果nums[rightIndex]不等于0的时候才交换,并且对left进行加
*/
while(rightIndex < nums.size()){
if(nums[rightIndex]){
int t = nums[rightIndex];
//很简洁 双指针自己和自己换的思想需要好好理解一下
nums[rightIndex] = nums[leftIndex];
nums[leftIndex] = t;
++leftIndex;
}
++rightIndex;
}
}
};
2023/4/5
题目(完成一半)303:区域和检索-数组不可变
对题目和函数的理解没到位
class NumArray {
vector<int>test;//全局变量
public:
NumArray(vector<int>& nums) {
test.resize(nums.size()+1);
for(int i=0;i<nums.size();i++){
test[i+1]=test[i]+nums[i];
}
}
int sumRange(int left, int right) {
return test[right+1]-test[left];
}
};
2023/4/6
题目(未完成)349:两个数组的交集
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
/* 存放结果,之所以用set是为了给结果集去重 */
unordered_set<int> result;
/* 由于输出的元素唯一不重复因此可以将nums1转化为unordered_set哈希表 */
unordered_set<int> nums1_set(nums1.begin(),nums1.end());
for(int i = 0; i < nums2.size(); i++){
/* 判断nums1_set中是否有nums2的元素,若有将此值插入到result */
if(nums1_set.find(nums2[i]) != nums1_set.end())
result.insert(nums2[i]);
}
return vector<int> (result.begin(),result.end());
}
};