请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加1。
第一行两个正整数n,v(1<=n<=100000,1<=v<=100000),分别表示数组长度与查找值。
第二行n个正整数a1,a2,...,an(1<=a1<=a2<=...<=an<=n)表示有序数组。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
5 4 1 2 4 4 5
3
5 4 1 2 3 3 5
5
5 4 1 2 2 3 3
6
#include<iostream>
#include<algorithm>
#include<string>
#include <vector>
using namespace std;
int binaryserch(vector<int>&v,int key){
int low,high,mid;
low=0;
high=v.size()-1;
while(low<=high){
mid=(low+high)/2;
if(v[mid]>=key){
int j = mid;
while(j>=0 && v[j]>=key){
j--;
}
return j+1+1;
}
//else if(v[mid]>key){
// high = mid-1;
//}
else{//v[mid] < key
low = mid+1;
}
}
return v.size()+1;
}
int main(){
int n,key;
vector<int>v;
cin>>n>>key;
int i;
for(i=0;i<n;i++){
int t;
cin>>t;
v.push_back(t);
}
cout<<binaryserch(v,key);
} #include <iostream>
#include <vector>
using namespace std;
int binarySearch(vector<int> &nums,int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int middle=left+(right-left)/2;
if(target<=nums[middle])
{
right=middle-1;
}
else
{
left=middle+1;
}
}
return left<nums.size()?left+1:nums.size()+1;
}
int main()
{
int len,target;
scanf("%d",&len);
scanf("%d",&target);
vector<int> nums(len);
for(int i=0;i<len;i++)
{scanf("%d",&nums[i]);
}
cout<<binarySearch(nums,target)<<endl;
return 0;
}
#include <stdio.h>
int find_location(int *array, int length, int val)
{
int low = 0;
int high = length;
int tmp;
int mid;
while (low < high)
{
mid = (low + high) / 2;
if (val > array[mid])
low = mid + 1;
else if (val <= array[mid])
high = mid;
}
return low + 1;
}
int main(int argc, char **agrv)
{
int num, findnum;
int array[100000];
int result;
scanf("%d", &num);
scanf("%d", &findnum);
for (int i = 0; i < num; i ++)
{
scanf("%d", &array[i]);
}
result = find_location(array, num, findnum);
printf("%d", result);
}
#include<iostream>
#include <vector>
using namespace std;
int binarySearch(std::vector<int> &vec, int target)
{
int low = 0;
int high = vec.size();//[low,high)区间搜索
int mid = 0;
while (low < high)
{
mid = (low + high) / 2;
if (vec[mid] == target)
{
high = mid;//收紧右区间
}
else if (vec[mid] < target)
{
low = mid + 1;
}
else
{
high = mid;
}
}
return low+1;
}
int main()
{
int len = 0;
int target = 0;
std::cin >> len;
std::cin >> target;
int ele;
std::vector<int> vec;
while (std::cin >> ele)
{
vec.push_back(ele);
if (vec.size() == len)
break;
}
std::cout << binarySearch(vec, target);
} #include <iostream>
#include <vector>
int binarySearch(std::vector<int> &vec,int target)
{
int low = 0;
int high = vec.size()-1;
int mid=0;
while (low <=high)
{
mid = (low + high) / 2;
if (vec[mid] == target)
{
while(vec[mid-1]==target) //保证取到的是第一个target
{
mid--;
}
return mid + 1;
}
else if(vec[mid]<target)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return vec.size() + 1;
}
int main()
{
int len=0;
int target = 0;
std::cin >> len;
std::cin >> target;
int ele;
std::vector<int> vec;
while (std::cin >> ele)
{
vec.push_back(ele);
if (vec.size() == len)
break;
}
std::cout<<binarySearch(vec, target);
} import java.util.Scanner;
/*
* Project_name:二分查找
5 3
1 2 3 3 5
*/
public class Main{
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int v=sc.nextInt();
int[] ch=new int[n];
for(int i=0;i<n;i++) {
ch[i]=sc.nextInt();
}
// System.out.println(v);
System.out.println(BineSearch(v,ch)+1);
}
private static int BineSearch(int v,int[] ch) {
// TODO Auto-generated method stub
int low=0;
int high=ch.length-1;
while(low<=high) {
int mid=(low+high)/2;
if(v<=ch[mid])
high= mid-1;
else if(v>ch[mid])
low=mid+1;
}
// System.out.println(low);
if(low<ch.length&&ch[low]>=v) {
return low;
}else {
return ch.length;
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); // 输入
while (input.hasNextInt()) {
int length = input.nextInt(); // 输入数组长度
int value = input.nextInt(); // 输入查询值
int array[] = new int[length];
for (int i = 0; i < length; i++) {
array[i] = input.nextInt(); // 输入数组元素值
}
int low = 0; // 设置边界左端位置
int high = length - 1; // 设置边界右端位置
while (low <= high) {
if (array[(low + high) / 2] < value) { // 若此段中间位置值小于查询值
low = (low + high) / 2 + 1; // 说明查询值位于此段右半段
}
if (array[(low + high) / 2] >= value) { // 若此段中间位置值大于等于查询值
high = (low + high) / 2 - 1; // 说明查询值位于此段右半段
}
}
if (low == length || high == -1) {
if (high == length - 1 && array[high] >= value) {
System.out.println(high + 1);
}
else if (low == 0 && array[low] >= value) {
System.out.println(low + 1);
}
else { // 说明查询值并不位于此数组中
System.out.println(length + 1);
}
}
else {
if (array[low] >= value && array[high] >= value) {
System.out.println(high + 1);
}
if (array[low] >= value && array[high] < value) {
System.out.println(low + 1);
}
}
}
}
}