第一题:二分查找
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题代码:
int search(int* nums, int numsSize, int target){
if(numsSize>0){
int low=0;
int high=numsSize-1;
int n=fangfa(nums,low,high,target);
return n;
}else{
return -1;
}
}
int fangfa(int* nums,int low,int high,int target){
while(low<=high){
//注意这里需要加low哟
int mid=low+(high-low)/2;
if(target==nums[mid]){
return mid;
}else if(target<nums[mid]){
high=mid-1;
return fangfa(nums,low,high,target);
}else{
low=mid+1;
return fangfa(nums,low,high,target);
}
}
return -1;
}
int search(int* nums, int numsSize, int target){
if(numsSize>0){
int low=0;
int high=numsSize-1;
while(low<=high){
int mid=low+(high-low)/2;
if(target==nums[mid]){
return mid;
}else if(target<nums[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
return -1;
}else{
return -1;
}
}
class Solution {
public int search(int[] nums, int target) {
int mid, left = 0, right = nums.length - 1;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
if (target < nums[mid]) right = mid - 1;
else left = mid + 1;
}
return -1;
}
}
第二题:第一个错误的版本
题目描述:
代码:C
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
int low=1,high=n;
while(low<high){
int mid=low+(high-low)/2;
if(isBadVersion(mid)){
//如果是错误的版本,那么第一个错误版本在[low,mid]里
high=mid;
}else{
//如果步是错误的版本,那么第一个错误版本在[mid+1,high]里
low=mid+1;
}
}
return low;
}
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1, right = n;
while (left < right) { // 循环直至区间左右端点相同
int mid = left + (right - left) / 2; // 防止计算时溢出
if (isBadVersion(mid)) {
right = mid; // 答案在区间 [left, mid] 中
} else {
left = mid + 1; // 答案在区间 [mid+1, right] 中
}
}
// 此时有 left == right,区间缩为一个点,即为答案
return left;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-bad-version/solution/di-yi-ge-cuo-wu-de-ban-ben-by-leetcode-s-pf8h/
来源:力扣(LeetCode)
第三题: 搜索插入位置
题目描述
代码如下:
重要的是确定插入位置,到最后插入的时候,会插入在指向小的区间的左边的指针
class Solution {
public int searchInsert(int[] nums, int target) {
int low = 0, high = nums.length-1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (target==nums[mid]) {
return mid;
} else if(target<nums[mid]) {
high = mid - 1;
}else{
low=mid+1;
}
}
return low;
}
}