(简单)存在重复元素 217
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
1、暴力排序
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(), nums.end()); //先将数组进行排序
int n=nums.size(); //记录数组长度
for(int i=0; i<n-1; i++)
{
if(nums[i]==nums[i+1]) //判断相邻元素是否相同,相同返回true,否则返回false
{
return true;
}
}
return false;
}
};
复杂度分析
时间复杂度:O(NlogN),其中 NN 为数组的长度。需要对数组进行排序。
空间复杂度:O(logN),其中 NN 为数组的长度。注意我们在这里应当考虑递归调用栈的深度。
2、哈希表
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> s;
for (int x: nums) {
if (s.find(x) != s.end()) {
return true;
}
s.insert(x);
}
return false;
}
};
复杂度分析
时间复杂度:O(N),其中 N为数组的长度。
空间复杂度:O(N)
最大子数组和 53
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
1、动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxAns=nums[0], pre=0;
for(const auto &x: nums)
{
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
从下标0到n-1,f(i)=max{f(i−1)+nums[i],nums[i]},分别对比之前的和当前最大,最后返回最大