请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加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); } } } } }