day1-数组
一、存在重复元素
1、描述
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例 1:
输入:nums = [1,2,3,1]
输出:true
示例 2:
输入:nums = [1,2,3,4]
输出:false
示例 3:
输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
2、思路
使用STL,将数组放入list/map之类的可以直接contains判断的类型。
也可以放入stack压入,一一对比之类的
初步计划:将每个数字放入map,每次放入后,对应的结果+1
3、代码
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
map<int,int> all_num;
int tmp;
for(int i = 0; i < nums.size(); i++) {
tmp = nums[i];
all_num[tmp]++;
if(all_num[tmp] >= 2)
return true;
cout << nums[i] << " "<<all_num[tmp] << endl;
}
return false;
}
};
int main() {
Solution sol;
vector<int> num = {1,1,1,3,3,4,3,2,4,2};
cout << sol.containsDuplicate(num) << endl;
return 0;
}
二、最大子数组和
1、描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
2、思路
类似于动态规划,最大值加当前数值,但是这个结果无法确保这个值是连续的
3、代码
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> copy;
int tmp = nums[0];
int sum = 0;
int max = tmp;
copy.push_back(tmp);
cout << copy[0] << endl;
for(int i = 1; i < nums.size(); i++) {
tmp = nums[i];
sum = tmp + copy[i - 1];
if(sum < tmp)
copy.push_back(tmp);
else
copy.push_back(sum);
max = max < copy.back() ? copy.back() : max;
cout << copy[i] << " " << max << endl;
}
return max;
}
};
int main() {
Solution sol;
vector<int> num = {-2,1};
sol.maxSubArray(num);
return 0;
}