文章目录
- 寻找数组的中心索引
- 题意:
- 解:
- 代码:
- 搜索插入位置
- 题意:
- 解:
- 代码:
- 合并区间
- 题意:
- 解:
- 代码:
寻找数组的中心索引
题意:
给定一个数组,找一个最小下标,它左边的数字和等于右边的数字和
解:
先计算总和,然后遍历
代码:
#include<bits/stdc++.h>
using namespace std;
int pivotIndex(vector<int>& nums)
{int lg=nums.size(),left=0,sum=accumulate(nums.begin(),nums.end(),0);for(int i=0;i<lg;i++){sum-=nums[i];if(left==sum) return i;left+=nums[i];}return -1;
}
int main()
{vector<int> nums;int num;while(cin>>num) nums.push_back(num);int ans=pivotIndex(nums);cout<<ans<<endl;return 0;
}
搜索插入位置
题意:
给定一个有序数组和一个整数,判断这个整数应该在插入到数组的哪个下标(如已存在数组内,则给出下标)
解:
要求时间复杂度为 O(log n)
的算法,二分lower_bound
代码:
#include<bits/stdc++.h>
using namespace std;
int searchInsert(vector<int>& nums, int target)
{int lg=nums.size();if(target>nums[lg-1]) return lg;int l=0,r=lg-1;while(l<r){int mid=l+((r-l)>>1);if(nums[mid]==target) return mid;else if(nums[mid]>target) r=mid;else l=mid+1;}return l;
}
int main()
{vector<int> nums;int num;int target;cin>>target;while(cin>>num) nums.push_back(num);int ans=searchInsert(nums,target);cout<<ans<<endl;return 0;
}
合并区间
题意:
数组里存储N个区间,求他们合并完的结果,区间为闭合区间
解:
先排序,然后简单合并
代码:
#include<bits/stdc++.h>
using namespace std;
bool cmp(const vector<int>& lhs,const vector<int>& rhs)
{return lhs[0]<rhs[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals)
{vector<vector<int>> ret;sort(intervals.begin(),intervals.end(),cmp);int l=-1,r=-1;for(auto &row:intervals){if(r==-1)//初始化{l=row[0],r=row[1];}else{if(row[0]<=r) r=max(r,row[1]);else{ret.push_back({l,r});l=row[0],r=row[1];}}}if(r!=-1) ret.push_back({l,r});return ret;
}
int main()
{vector<vector<int>> intervals;int t1,t2;while(cin>>t1>>t2) intervals.push_back({t1,t2});vector<vector<int>> ans=merge(intervals);for(auto &row:ans){for(auto &col:row) cout<<col<<ends;cout<<endl;}return 0;
}