QR1. 二分查找
描述
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
[1,3,5,7,9],5,3
返回:1
C++ 解法, 执行用时: 2ms, 内存消耗: 408KB, 提交时间: 2022-01-27
class BinarySearch { public: int getPos(vector<int> A, int n, int val) { // write code here int low,mid,high; low=0; high=n-1; while (low<=high) { mid=(low+high)/2; if(A[mid]>val) { high=mid-1; } else if(A[mid]==val) { if((mid>0&&A[mid-1]!=val)||mid==0) return mid; else high=mid-1; } else { low=mid+1; } } return -1; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 424KB, 提交时间: 2022-01-26
class BinarySearch { public: int getPos(vector<int> A, int n, int val) { // write code here int i,j; i=0;j=n-1; int t; while(i<=j){ t=(i+j)/2; if(A[t]==val){ if(t>0&&A[t-1]!=val||t==0) return t; j=t-1; } if(A[t]>val) j=t-1; if(A[t]<val) i=t+1; } return -1; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2022-01-24
class BinarySearch { public: int getPos(vector<int> A, int n, int val) { // write code here int left = 0,right = n-1; while(left<=right) { int mid = (left+right)/2; if(A[mid] == val) { if(A[mid-1] == val && mid>0) mid--; return mid; break; } else if(A[mid]>val) { right = mid-1; } else if(A[mid]<val) { left = mid+1; } } return -1; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-08-17
class BinarySearch { public: int getPos(vector<int> A, int n, int val) { // write code here int l = 0; int r = n -1; while(l <= r){ int mid = (l+r)/2; if (A[mid] == val){ while(A[mid] == val){ mid--; } return mid + 1; }else if(A[mid] > val){ r = mid - 1; }else{ l = mid + 1; } } return -1; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 448KB, 提交时间: 2022-04-17
class BinarySearch { public: int firstpos(vector<int> A,int pos){ while(pos-1>=0 && A[pos-1]==A[pos]) pos--; return pos; } int getPos(vector<int> A, int n, int val) { int left=0,right=n-1; while(left<=right){ int pos=(left+right)/2; if(A[pos]==val) return firstpos(A,pos); else if(A[pos]>val) right=pos-1; else left=pos+1; } return -1; } //return 0; };