【leetcode】数组篇刷题 --二分查找

*
* @lc app=leetcode.cn id=704 lang=cpp
*
* [704] 二分查找
*/
// @lc code=start
class Solution {
public:
int search(vector<int>& nums, int target) {
int lp = 0;
int rp = nums.size()-1;
int middle;
while(lp <= rp) {
middle = lp + (rp - lp) / 2;
if(target > nums[middle]) {
lp = middle + 1;
}else if(target < nums[middle]){
rp = middle - 1;
}else if(target == nums[middle]){
return middle;
}
}
return -1;
}
};
/*
* @lc app=leetcode.cn id=34 lang=cpp
*
* [34] 在排序数组中查找元素的第一个和最后一个位置
*/
// @lc code=start
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//暴力解法
//循环匹配,
//初始化arr中两个元素均为-1
vector<int> arr(2,-1);
for (int i = 0; i < nums.size(); i++)
{
/* 加速执行(大于目标值,直接返回) */
if(target < nums[i]){
return arr;
}
//匹配到第一个target时,start与end索引均为此值的索引,
//而后的匹配中,仅修改end索引
if(target == nums[i]){
if(arr[0] == -1){
arr[0] = i;
arr[1] = i;
}else{
arr[1] = i;
}
}
}
return arr;
}
};
// @lc code=end
/*
* @lc app=leetcode.cn id=34 lang=cpp
*
* [34] 在排序数组中查找元素的第一个和最后一个位置
*/
// @lc code=start
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//分别查找startIndex与endIndex
int stratIndex = -1;
int endIndex = -1;
//左右指针
int lp = 0;
int rp = nums.size() - 1;
int middle = 0;
//找出startIndex
while(lp <= rp) {
middle = lp + (rp - lp) / 2;
if(target < nums[middle]) {
rp = middle - 1;
} else if(target > nums[middle]) {
lp = middle + 1;
} else if(target == nums[middle]) {
stratIndex = middle;
//关键:找到一个target时,向左边移动rp,目的是在接下来的循环中找到并确认startIndex的最终值
rp = middle - 1;
}
}
//找出endIndex
lp = 0;
rp = nums.size() - 1;
while(lp <= rp) {
middle = lp + (rp - lp) / 2;
if(target < nums[middle]) {
rp = middle - 1;
} else if(target > nums[middle]) {
lp = middle + 1;
} else if(target == nums[middle]) {
endIndex = middle;
//找到一个target便将lp向右移动,以确认最终的endIndex
lp = middle + 1;
}
}
return {stratIndex,endIndex};
}
};
// @lc code=end

本题最终二分解法,二分复用版

/*
* @lc app=leetcode.cn id=34 lang=cpp
*
* [34] 在排序数组中查找元素的第一个和最后一个位置
*/
// @lc code=start
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//分别查找startIndex与endIndex
int stratIndex = binarySerach(nums,target,false);
int endIndex = binarySerach(nums,target,true);
return {stratIndex,endIndex};
}
//将上文的找startIndex与endIndex两次二分进行了复用
int binarySerach(vector<int>& nums, int target, bool turn) {
int index = -1;
//左右指针
int lp = 0;
int rp = nums.size() - 1;
int middle = 0;
//找出Index
while(lp <= rp) {
middle = lp + (rp - lp) / 2;
if(target < nums[middle]) {
rp = middle - 1;
} else if(target > nums[middle]) {
lp = middle + 1;
} else if(target == nums[middle]) {
index = middle;
if(turn){
lp = middle + 1;
}else{
rp = middle - 1;
}
}
}
return index;
}
};
// @lc code=end
/*
* @lc app=leetcode.cn id=367 lang=cpp
*
* [367] 有效的完全平方数
*/
// @lc code=start
class Solution {
public:
bool isPerfectSquare(int num) {
//暴力,由1开始匹配
long square = 1;
long x = 1;
//num的平方数的平方必定=num,当大于时则num不存在平方数
while(square <= num){
square = x * x;
if(square == num){
return true;
}
x++;
}
return false;
}
};
// @lc code=end
/*
* @lc app=leetcode.cn id=367 lang=cpp
*
* [367] 有效的完全平方数
*/
// @lc code=start
class Solution {
public:
bool isPerfectSquare(int num) {
//1,和num本身左右搜索边界,用常规二分写法即可
long lp = 1;
long rp = num;
long middle;
while(lp <= rp){
middle = lp + (rp - lp) / 2;
if(middle*middle < num){
lp = middle + 1;
}else if(middle*middle > num){
rp = middle - 1;
}else if(middle*middle == num){
return true;
}
}
return false;
}
};
// @lc code=end
// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem69.h"
using namespace std;
// @before-stub-for-debug-end
/*
* @lc app=leetcode.cn id=69 lang=cpp
*
* [69] x 的平方根
*/
// @lc code=start
class Solution {
public:
int mySqrt(int x) {
//设置搜索边界从1到x
long lp = 1;
long rp = x;
long middle;
//x的平方根仅存在两种情况(偏小或偏大)
//1.恰好取整数
//2.舍去后取整数
while(lp <= rp) {
middle = lp + (rp - lp) / 2;
if(middle* middle <= x && (middle+1)*(middle+1) > x){
return middle;
}else if(middle*middle > x){
rp = middle - 1;
}else{
lp = middle + 1;
}
}
return 0;
}
};
// @lc code=end
posted @   main(void)  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-02-22 Python 类 初学者笔记
.c_ad_block { display: none !important; } #ad_t2{ display: none !important; }
点击右上角即可分享
微信分享提示