美文网首页
找到最后一个不大于target的元素以及找到第一个不小于targ

找到最后一个不大于target的元素以及找到第一个不小于targ

作者: 不知名小号 | 来源:发表于2020-02-24 20:57 被阅读0次

findLastNotBiggerThan,找到最后一个不大于target的元素,返回下标。

假设l, r是可能产生结果的区间。
l和r取中间mid

如果v[mid] <= target,则说明mid左边的数都是小于等于target的,而且mid又是这些数里最右边的,所以,相比于mid左边的数,mid更有可能是答案,故排除mid左边的数,令l = mid。
否则,v[mid] > target,我们要找的是不大于,所以mid不可能是解,并且mid右边的数都是大于v[mid]的,故将mid和mid右边的数都排除,即r = mid - 1

findFirstNotSmallThan,找到第一个不小于target的元素,返回下标

如果v[mid] >= target,那它右边的数都大于target,而且mid是这些数里最靠左的,所以排除了mid右边的元素,r = mid。
否则,v[mid] < target,那它左边的元素都是小于target的,mid本身不符合答案,mid左边的元素也不符合,所以l = mid + 1。

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(s) memset(s, 0, sizeof(s))
const int inf = 0x3f3f3f3f;
const int maxn = 1e5 + 7;
#define LOCAL

int findLastNotBiggerThan(std::vector<int> v, int target){
    int l = 0, r = v.size() - 1;
    while (l < r){
        int mid = (l + r + 1) / 2;
        if (v[mid] <= target){
            l = mid;
        }
        else{
            r = mid - 1;
        }
    }
    return l;
}
int findFirstNotSmallThan(std::vector<int> v, int target){
    int l = 0, r = v.size() - 1;
    while (l < r){
        int mid = (l + r) / 2;
        if (v[mid] >= target){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    return l;
}



int main(int argc, char * argv[]) 
{
 //   std::vector<int> v(1, 1, 2, 3, 5, 8);
    int a[] = {1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 8, 10};
    vector<int> v(a, a + 12);
    for (int i = 0; i < v.size(); i++){
        cout << i << ": " << v[i] << " | ";
    }
    cout << endl;
    while (1){
        int t;
        cin >> t;
        cout << "findFirstNotSmallThan(v, t)" << endl;
        cout << findFirstNotSmallThan(v, t) << endl;
        cout << "findLasttNotBiggerThan(v, t)" << endl;
        cout << findLastNotBiggerThan(v, t) << endl;

    }
    return 0;
}

相关文章

  • 找到最后一个不大于target的元素以及找到第一个不小于targ

    findLastNotBiggerThan,找到最后一个不大于target的元素,返回下标。 假设l, r是可能产...

  • LintCode 901. 二叉搜索树中最接近的值 II

    题目描述 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数。 给出的targ...

  • 二分查找

    二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到targ...

  • 选择排序

    首先在数组中找到最小的元素,然后把它和第一个元素交换。然后在剩余的元素中不断的找到最小者与第一个元素交换。

  • Kantu——内置命令介绍(一)

    内置命令介绍 open:打开一个页面,Target填写的是需要打开的网页的链接 click:点击某个元素,Targ...

  • 二分查找的思考

    left左边的一定比target小,left对应的元素为第1个不小于target的。因此,如果nums中targe...

  • 算法入门——顺序查找、二分查找

    顺序查找 顺序查找也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。 例...

  • 堆排序

    我们在进行选择排序时,找到第一个最小的元素需要n-1次,找到第二个最小的元素需要n-2次,直到最后的比较1次。堆排...

  • 查找

    顺序查找 也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止 时间复杂度:...

  • Python 实现选择排序

    选择排序算法步骤: 找到数组中最小的那个元素中, 将它和数组的第一个元素交换位置, 在剩下的元素中找到最小的元素,...

网友评论

      本文标题:找到最后一个不大于target的元素以及找到第一个不小于targ

      本文链接:https://www.haomeiwen.com/subject/tidwqhtx.html