给定按升序排序的整数数组,找到给定目标值的开始和结束位置。 如果在数组中找不到目标,则返回[-1,-1]。
2017-12-08 09:47
369 查看
本题源自leetcode 34
-----------------------------------------------------------
思路:用二分查找的思路,首先找出最左边的target,就是当target <= num【mid】 end = mid;
2 然后 第一次循环结束后判断 start 等于 target,就是最左边的。然后找最右边的target 一样用 二分查找的方法
代码:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> ret(2, -1);
if(n == 0)
return ret;
int i = 0, j = n - 1;
while (i < j) //找最左边的
{
int mid = (i + j) /2;
if (nums[mid] < target)
i = mid + 1;
else
j = mid;
}
if (nums[i]!=target)
return ret;
else
ret[0] = i;
// 找最右边的
j = n-1; //
while (i < j)
4000
{
int mid = (i + j) /2 +1 ; // 让中间点基于右边
if (nums[mid] > target)
j = mid - 1;
else
i = mid;
}
ret[1] = j;
return ret;
}思路 2 用 stl的函数
代码:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = lower_bound(nums.begin(),nums.end(),target)-nums.begin();
if(lo == n || nums[lo] != target)
return res;
res[0] = lo;
int hi = upper_bound(nums.begin(),nums.end(),target) - nums.begin() -1;
res[1] = hi;
return res;
}
思路3 :
代码;
int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = 0;
int hi = n-1;
int idx = -1;
while(lo <= hi){ //求 最左边的 target
int mid = (lo + hi) >> 1;
if(nums[mid] >= target)
hi = mid - 1;
else
lo = mid + 1;
if(nums[mid] == target)
idx = mid;
}
res [0] = idx;
// lo = 0;
hi = n-1;
while(lo <= hi){ //最右边的target
int mid = (lo + hi) >> 1;
if(nums[mid] <= target)
lo = mid + 1;
else
hi = mid - 1;
if(nums[mid] == target)
idx = mid;
}
res[1] = idx;
return res;
}
-----------------------------------------------------------
思路:用二分查找的思路,首先找出最左边的target,就是当target <= num【mid】 end = mid;
2 然后 第一次循环结束后判断 start 等于 target,就是最左边的。然后找最右边的target 一样用 二分查找的方法
代码:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> ret(2, -1);
if(n == 0)
return ret;
int i = 0, j = n - 1;
while (i < j) //找最左边的
{
int mid = (i + j) /2;
if (nums[mid] < target)
i = mid + 1;
else
j = mid;
}
if (nums[i]!=target)
return ret;
else
ret[0] = i;
// 找最右边的
j = n-1; //
while (i < j)
4000
{
int mid = (i + j) /2 +1 ; // 让中间点基于右边
if (nums[mid] > target)
j = mid - 1;
else
i = mid;
}
ret[1] = j;
return ret;
}思路 2 用 stl的函数
代码:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = lower_bound(nums.begin(),nums.end(),target)-nums.begin();
if(lo == n || nums[lo] != target)
return res;
res[0] = lo;
int hi = upper_bound(nums.begin(),nums.end(),target) - nums.begin() -1;
res[1] = hi;
return res;
}
思路3 :
代码;
int n = nums.size();
vector<int> res(2,-1);
if(n == 0)
return res;
int lo = 0;
int hi = n-1;
int idx = -1;
while(lo <= hi){ //求 最左边的 target
int mid = (lo + hi) >> 1;
if(nums[mid] >= target)
hi = mid - 1;
else
lo = mid + 1;
if(nums[mid] == target)
idx = mid;
}
res [0] = idx;
// lo = 0;
hi = n-1;
while(lo <= hi){ //最右边的target
int mid = (lo + hi) >> 1;
if(nums[mid] <= target)
lo = mid + 1;
else
hi = mid - 1;
if(nums[mid] == target)
idx = mid;
}
res[1] = idx;
return res;
}
相关文章推荐
- 给定按升序排序的整数数组,找到给定目标值的起始和终止位置。 您的算法的运行时复杂度必须是O(log n)的顺序。
- 中位数 21% 通过 给定一个未排序的整数数组,找到其中位数。 中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数
- 给定整形数组A和目标整数t,A相邻元素差绝对值为1,请找到t在A中的位置
- //写一个生成10个100以内随机数数据,再进行冒泡排序,顺序,//二分查找法找到一个值得位置,如果没有则为-1,有则返回数组位置
- :输入10个整数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出“没有找到!
- indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回 -1
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- JQuery确定第一个参数在数组中的位置,从0开始计数(如果没有找到则返回 -1 )。
- 有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。
- 给定整形数组A和目标整数t,A相邻元素差绝对值为1,请找到t在A中的位置
- 346/5000 给定一个n个整数的数组S,在S中找到三个整数,使得总和最接近给定数量的目标。 返回三个整数的和。
- 给定整形数组A和目标整数t,A相邻元素差绝对值为1,请找到t在A中的位置
- 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置。
- 在已知字符串中查找给定的子串,若找到返回位置,找不到返回-1
- (java)整数数组中求最大连续子序列之和,并且记录开始和结束位置
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- 给定一个没有重复的已排序整数数组,返回其范围的摘要。
- 定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- Two Sum 从数组中找到两个位置的值相加和为给定目标的值