代码随想录【数组】 ---- 二分查找

代码随想录【数组】 ---- 二分查找

  • 704.二分查找
    • 方法一:二分查找
  • 35.搜索插入位置
    • 方法一:二分查找
  • 34.在排序数组中查找元素的第一个和最后一个位置
    • 方法一:二分查找
  • 69.x的平方根
    • 方法一:袖珍计算器
    • 方法二:二分查找
    • 方法三:牛顿迭代法
  • 367.有效的完全平方数
    • 方法一:使用内置函数
    • 方法二:暴力
    • 方法三:二分查找
    • 方法四:牛顿迭代法

704.二分查找

方法一:二分查找

这题就是二分查找的模板题,将二分的模板背上就行了

class Solution {public int search(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + right >> 1;if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else if (nums[mid] < target) left = mid + 1;}return -1;}
}

时间复杂度: O(n)
空间复杂度: O(1)

35.搜索插入位置

方法一:二分查找

二分查找 target 的位置,要明确什么时候返回 target 的位置,返回 left 或者是 right - 1

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1;int mid = 0;while (left <= right) {mid = left + right >> 1;if (nums[mid] == target) return mid;else if (nums[mid] > target) right = mid - 1;else if (nums[mid] < target) left = mid + 1;}// return left;return right - 1;}
}

时间复杂度: O(logn)
二分查找的时间复杂度是 O(logn) 级别的

空间复杂度: O(1)

34.在排序数组中查找元素的第一个和最后一个位置

方法一:二分查找

第一次二分查找 nums[mid] >= target 的左边界,第二次二分查找 nums[mid] <= target 的右边界

y总模板

class Solution {public int[] searchRange(int[] nums, int target) {if (nums.length == 0) return new int[]{-1, -1};int l = 0, r = nums.length - 1;while (l < r) {int mid = l + r >> 1;if (nums[mid] >= target) r = mid;else l = mid + 1;}if (nums[r] != target) return new int[]{-1, -1};int L = r;l = 0; r = nums.length - 1;while (l < r) {int mid = l + r + 1 >> 1;if (nums[mid] <= target) l = mid;else r = mid - 1;}return new int[]{L, r};}
}

代码随想录

class Solution {public int[] searchRange(int[] nums, int target) {if (nums.length == 0) return new int[]{-1, -1};int l = 0, r = nums.length - 1;int L = -1, R = -1;while (l <= r) {int mid = l + r >> 1;if (nums[mid] >= target) {L = mid;r = mid - 1;} else {l = mid + 1;}}if (L < 0 || L >= nums.length || nums[L] != target) return new int[]{-1, -1};l = 0; r = nums.length - 1;while (l <= r) {int mid = l + r >> 1;if (nums[mid] <= target) {R = mid;l = mid + 1;} else {r = mid - 1;}}return new int[]{L, R};}
}

时间复杂度: O(logn)
二分查找的时间复杂度是 O(logn) 级别的

空间复杂度: O(1)

69.x的平方根

方法一:袖珍计算器

使用指数函数 exp 和对数函数 log 来代替平方根函数
在这里插入图片描述

class Solution {public int mySqrt(int x) {if (x == 0) return 0;int ans = (int)Math.exp(0.5 * Math.log(x));return (long)(ans + 1) * (ans + 1) <= x ? ans + 1 : ans;}
}

时间复杂度: O(1)

空间复杂度: O(1)

方法二:二分查找

由于 x 平方根的整数部分 ans 是满足 k2≤x 的最大 k 值,因此我们可以对 k 进行二分查找,从而得到答案。

class Solution {public int mySqrt(int x) {int left = 0, right = x;int mid = 0, ans = -1;while (left <= right) {mid = left + right >> 1;if (mid * mid <= x) {left = mid + 1;ans = mid;}else right = mid - 1;}return ans;}
}

时间复杂度: O(logn)
二分查找的时间复杂度是 O(logn) 级别的

空间复杂度: O(1)

方法三:牛顿迭代法

没看懂。。。。
后面懂了再更新

367.有效的完全平方数

方法一:使用内置函数

class Solution {public boolean isPerfectSquare(int num) {int x = (int) Math.sqrt(num);return x * x == num;}
}

方法二:暴力

从 1 开始遍历,如果出现了 x * x > num 的情况,说明后面的数也不可能满足情况了,就结束遍历即可

class Solution {public boolean isPerfectSquare(int num) {long x = 1, square = 1;while (square <= num) {if (square == num) return true;x ++ ;square = x * x;}return false;}
}

时间复杂度: O(√n)
n 为 num 的最大值,最多只需遍历 √n + 1 个值

空间复杂度: O(1)

方法三:二分查找

与上个题目的二分查找类似

class Solution {public boolean isPerfectSquare(int num) {int l = 0, r = num;int ans = -1;while (l <= r) {int mid = l + r >> 1;long square = (long) mid * mid;if (square == num) return true;else if (square < num) l = mid + 1;else r = mid - 1;}return false;}
}

方法四:牛顿迭代法

看不懂。。。
但是看答案,与上个题目的牛顿迭代法答案类似,或许直接背一个模板也可以吧。哈哈哈哈哈哈。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504919.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音小店的产品价格怎么设置?都需要什么价位的产品?

大家好&#xff0c;我是电商花花。 做抖音小店&#xff0c;一个合理的商品的价格也可以说是非常重要的&#xff0c;价格合理才会吸引到用户这购买。 可能说到价格&#xff0c;很多人第一反应认为随便定就可以了&#xff0c;其实定价是很复杂了&#xff0c;定价定多少&#xf…

一份简单的前端开发指南

文章目录 一、HTML1、表格2、常见标签3、行内、块级4、行内块级元素 二、CSS1、三种样式2、链接样式3、浮动4、清除浮动5、伪类&#xff0c;伪元素6、position7、后代选择器8、弹性布局 三、JavaScripts1、null和undefined的区别2、var let const3、原生数据类型4、双等和三等5…

Vue3 条件渲染 v-if

v-if 指令&#xff1a;用于控制元素的显示或隐藏。 执行条件&#xff1a;当条件为 false 时&#xff0c;会将元素从 DOM 中删除。 应用场景&#xff1a;适用于显示隐藏切换频率较低的场景。 语法格式&#xff1a; <div v-if"数据">内容</div> 基础用…

KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)

**《KubeSphere平台安装系列》** 【Kubernetes上安装KubeSphere&#xff08;亲测–实操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux单节点部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多节点部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

图论 - DFS深度优先遍历、BFS广度优先遍历、拓扑排序

文章目录 前言Part 1&#xff1a;DFS&#xff08;深度优先遍历&#xff09;一、排列数字1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 二、n皇后问题1.问题描述输入格式输出格式数据范围输入样例输出样例 2.算法 三、树的重心1.问题描述输入格式输出格式数据范围…

Laravel框架: Call to a member function connect() on null 异常报错处理

Laravel框架&#xff1a; Call to a member function connect() on null 异常报错处理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文链接: https://learnku.com/laravel/t/63721 问题&#xff1a; local.ERROR: Call to a member function connect() on null {"…

为什么模电这么难学?这是我见过最好的回答

大家好&#xff0c;我是砖一&#xff0c;有很多人抱怨模电难学&#xff0c;被誉为电子信息挂科率最高之一&#xff0c;下面听我分析一下为啥模电这么难学&#xff1f; 01 理科的抽象思维 在高等教育体系中&#xff0c;模电是涉及半导体方向的第一门工程类课程&#xff0c;是一…

venv、pip、conda、anaconda、miniconda的区别和优缺点,和彻底清除python多余的环境

virtualenv(venv) 这是一个虚拟环境管理器&#xff0c;它可以让你每个项目甚至每个脚本配置一个自定义的Python解释器环境&#xff0c;这最大的好处是我可以不污染开发环境。​ pip pip 是 Python 最常用的包管理器&#xff0c;它能自动处理依赖 。 conda 如果说venv是虚拟…

大数据权限认证 Kerberos 部署

文章目录 1、什么是 Kerberos2、Kerberos 术语和原理2.1、Kerberos 术语2.1、Kerberos 原理 3、Kerberos 服务部署3.1、前置条件3.2、安装依赖3.3、配置 krb5.conf3.4、配置 kdc.conf3.5、配置 kadm5.acl3.6、安装 KDC 数据库3.7、启动服务3.8、创建 Kerberos 管理员3.9、创建普…

C++——模版

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;这是2024年的第一篇博文&#xff0c;我们将继续C的学习&#xff0c;今天这篇文章&#xff0c;我们来习一下——模版。 目录 一.什么是模版 二.模版分类 1.函数模版 2.类模板 总结 一.什么是模版 说起模版&#xff0c;我们…

深入理解Python中的math和decimal模块:数学基础与高精度计算实战【第104篇—math和decimal模块】

深入理解Python中的math和decimal模块 在Python中&#xff0c;math 和 decimal 模块是处理数学运算的重要工具。math 提供了一系列常见的数学函数&#xff0c;而 decimal 则专注于高精度的浮点数运算。本文将深入探讨这两个模块的基础知识&#xff0c;并通过实际的代码示例演示…

如何利用pynlpir进行中文分词并保留段落信息

一、引言 nlpir是由张华平博士开发的中文自然处理工具&#xff0c;可以对中文文本进行分词、聚类分析等&#xff0c;它既有在线的中文数据大数据语义智能分析平台&#xff0c;也有相关的python包pynlpir&#xff0c;其github的地址是&#xff1a; Pynlpir在Github上的地址 这…