十四、LeetCode第十四题(56)
合并区间
这个题目比较简单,不详细说了,贴个代码记录一下。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
sort(intervals.begin(), intervals.end());
ans.push_back(intervals[0]);
int n = intervals.size();
for(int i = 1; i<n; i++){
if(intervals[i][0] > ans.back()[1])
{ans.push_back(intervals[i]);}
else{
ans.back()[1] = max(ans.back()[1], intervals[i][1]);
}
}
return ans;
}
};
十五、LeetCode第十五题(189)
轮转数组
也比较简单,不管用什么方法都能做出来,就是对数组的基本操作。
贴一个简单的答案(评论区看见的):三次翻转就可以了
class Solution {
public:
void rotate(vector<int> &nums, int k) {
k %= nums.size();
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin() + k);
reverse(nums.begin() + k, nums.end());
}
};
十六、LeetCode第十六题(238)
除自身以外数组的乘积
要求不能用除法且时间复杂度为O(n),比前两题稍微加难度了。
核心的思路就是找到第 i 个数左边的数的乘积 L(i) 与右边的数的乘积 R(i),那么第 i 个数以外的所有数乘积就是 L(i)*R(i)。想到这个就好做了。
代码:
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
vector<int>L(n), R(n);
L[0] = R[n-1] = 1;
int mul = 1;
ans[0] = 1;
//我加上了判断数组里面有一个0,没有0和其他情况
if(count(nums.begin(), nums.end(), 0) == 1){
auto it = find(nums.begin(), nums.end(), 0);
int cur = it-nums.begin();
nums[cur] = 1;
for(int i = 0; i<n; i++){
//if(i =find(nums.begin(), nums.end(), 0)) continue;
ans[i] = 0;
mul *= nums[i];
}
ans[cur] = mul;
nums[cur] = 0;
}
else if(count(nums.begin(), nums.end(), 0) == 0){
for(int i = 1; i<n; i++){
L[i] = L[i-1]*nums[i-1];
}
for(int i = n-2; i>=0; i--){
R[i] = R[i+1]*nums[i+1];
}
for(int i = 0; i<n; i++){
ans[i] = L[i]*R[i];
}
}
//数组中如果有两个及以上的0,那最后的乘积都是0
else {
for(int i = 0; i<n; i++) ans[i] = 0;
}
return ans;
}
};
十七、LeetCode第十七题(41)
缺失的第一个正数
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
这道题限制了时间复杂度和空间复杂度,感觉好难,我在根据哈希表的提示之后写出来下面这个代码,但是不满足限制要求。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int slow = 0, fast = 0, size = nums.size();
for (; fast < size; fast++){
if (nums[fast] > 0){
nums[slow] = nums[fast];
slow++;
}
}
unordered_map<int,int> mp;
int n = nums.size();
int ans = 1;
for(int i = 1; i<=n; i++){
mp[i] = count(nums.begin(), nums.end(), i);
if(mp[i] == 0){
ans = i;
break;
}
else ans = n+1;
}
return ans;
}
};
但是其他的解法即使能看懂,也不容易想。这个题先放一放了。
接下来就开始矩阵题了,冲冲冲!