704 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
链接:https://leetcode.cn/problems/binary-search
链接:https://programmercarl.com
#include <stdio.h>
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
static int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
}
else if (nums[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
};
int main() {
vector<int>nums= { 1,2,3,4,5,6,7,8,9 };
int target = 6;
auto mid = Solution::search(nums, target);
cout << mid << endl;
system("pause");
return 0;
}
35 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
链接:https://leetcode.cn/problems/search-insert-position
#include <stdio.h>
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
static int searchInsert(vector<int>& nums, int target) {
//首先利用二分法查找是否存在
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (target > nums[mid]) {
left = mid + 1;
}
else if (target < nums[mid]) {
right = mid - 1;
}
else {
return mid;//存在,输出位置
}
}
//不存在,找到对应位置
return right + 1;
}
};
int main() {
vector<int>nums= { 1,2,3,6,8,9 };
int target = 5;
auto mid = Solution::searchInsert(nums, target);
cout << mid << endl;
system("pause");
return 0;
}
34 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
#include <stdio.h>
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
static vector<int> searchRange(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int result[] = { -1,-1 };
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
}
else if (nums[mid] > target) {
right = mid - 1;
}
else {
int midleft = mid;
while (nums[midleft] == target) {
midleft--;
if (midleft < 0) {
break;
}
}
result[0] = ++midleft;
int midright = mid;
while (nums[midright] == target) {
midright++;
if (midright >= nums.size()) {
break;
}
}
result[1] = --midright;
return { result[0],result[1] };
}
}
return { result[0],result[1] };
}
};
int main() {
vector<int>nums= { 1,2,3,3,6,6,8,9 };
int target = 6;
auto mid = Solution::searchRange(nums, target);
cout << mid[0] << endl;
cout << mid[1] << endl;
system("pause");
return 0;
}
69、给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
链接:https://leetcode.cn/problems/sqrtx
class Solution {
public:
int mySqrt(int x) {
long left = 0;
long right = x;
while (left <= right){
long mid = left + (right - left)/2;
if(mid * mid < x){
left = mid + 1;
}
else if(mid * mid > x){
right = mid - 1;
}
else{
return mid;//恰好返回
}
}
return right;//返回一个小值
}
};