寻找数组中心
题目序号724 1991
给一个整数数组 nums ,计算数组的 中心下标
示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。
思路:先计算每个元素的和,然后再反向进行减去比较.
时间复杂度:
O
(
n
)
O(n)
O(n)
class Solution {
public:
int findMiddleIndex(vector<int>& nums) {
int l=0;
int r=0;
for(auto e:nums){
r+=e;
}
for (int i=0;i<nums.size();i++){
r-=nums[i];
if(r==l){
return i;
}
l+=nums[i];
}
return -1;
}
};
搜索插入位置
给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
题目要求必须使用时间复杂度为
O
(
l
o
g
n
)
O(log n)
O(logn)的算法。所以穷举循环不符合题意
可以使用二分查找法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l=0;
int r=nums.size()-1;
int m=-1;
int ret=nums.size();
while(l<=r){
m=(r-l)/2+l;
if (nums[m]<target) {
l=m+1;
}
else{
ret=m;
r=m-1;
}
}
return ret;
}
};
合并有效区间
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
int l=intervals[0][0];
int r=intervals[0][1];
bool isNew=true;
vector<vector<int>> vec2;
for(size_t i=1;i<intervals.size();i++){
if(r>=intervals[i][0]){
l=min(l,intervals[i][0]);
r=max(r,intervals[i][1]);
cout<<l<<" "<<r<<" "<<i<<intervals[i][0]<<intervals[i][1]<<endl;
}
else{
vec2.push_back({l,r});
isNew=false;
l=intervals[i][0];
r=intervals[i][1];
}
// cout<<i<<" "<<l <<" "<<r<<endl;
}
vec2.push_back({l,r});
return vec2;
}
};