二分法题集2

2024-04-07 15:20
文章标签 二分法 题集

本文主要是介绍二分法题集2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1  山脉数组的峰顶索引

分析:

代码展示:

2 寻找峰值

分析:

代码展示:

3  寻找旋转排序数组中的最小值

分析:

代码展示:

4 点名

分析:

代码展示:


1  山脉数组的峰顶索引

分析:

我们前面说过只要是有二段性的就可以用二分法。这道题时间复杂度要求是logn那么也在提示我们用二分法做。前面几道题大家可以很容易想到如何二分,而这道题及后面的题难点在于如何找出题的二段性,只要找出规律那么题解模板都是一样的。

这道题中题目给了我们思路,目标值的左边均是递增,目标值的右边均是递减,那么我们就可以根据递增递减作为二分依据,然后就可以将题目转换为找出数组中最后一个递增的下标(同理我们也可以转换为找出第一个递减的下标)。

代码展示:


以找出最后一个递增下标为例

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 1;int right = arr.length - 2;while(left < right) {int middle = left + (right - left + 1) / 2;if(arr[middle] < arr[middle - 1]) {right = middle -1;}else {left = middle;}}return left;}
}

只要当前值存在于递减序列,那我们就让right = middle - 1,那么right最后指向的一定是最后一个递增下标。

由于题目中说,数组一定是山峰数组,所以数组0和最后一个下标一定不是目标值,所以我们将 left = 0 ,right = arr.length - 2即可。

以找出第一个递增下标为例

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 1;int right = arr.length - 2;while(left < right) {int middle = left + (right - left) / 2;if(arr[middle] < arr[middle + 1]) left = middle +1;else right = middle;}return left;}
}
2 寻找峰值

分析:

这道题个上道题的不同点:

1 数组中左右边界值都是无穷小,因此我们可以理解为,递增数组的最后一个值就是峰值,递减数组的第一个值就是峰值;

2 该数组中存在多个峰值,但只需要返回其中一个即可。

代码展示:
class Solution {public int findPeakElement(int[] arr) {if(arr.length < 2) return 0;int left = 0;int right = arr.length - 1;while(left < right) {int middle = left + (right - left) / 2;if(arr[middle] < arr[middle + 1]) left = middle +1;else right = middle;}return left;}
}

代码和上一道题的基本没有变化,虽然存在多个峰值,但是因为我们的left是小于right也就保证了我们一定可以求出一个峰值。

3  寻找旋转排序数组中的最小值

分析:

这道题让我们用longn的算法解决,那么我们就要去想到二分。接下来我们要找到这道题的二分性。我们可以发现如果选取数组第一个值为参考时,则最小值到该数区域内均大于该数,最小值到数组末尾均小于该数,那么我们就可以转换为找出第一个小于数组0小标值的元素。当然如果第一个数就是最小数,那么我们结尾分情况讨论。当找出二分性的依据之后,那代码和之前的没有什么变化

代码展示:
class Solution {public int findMin(int[] nums) {int left = 0;int right = nums.length - 1;int tmp = nums[left];while(left < right) {int middle = left + (right - left ) / 2;if(nums[middle] >= tmp){left = middle + 1;}else {right = middle;}}if(nums[left] < tmp)return nums[left];else return nums[0];}
}
4 点名

分析:

这道题我们可以用二分法做:

二分依据:下标值等于对应的数组值和下标值不等于对应的数组值。这样问题就转换为找出第一个下标值与对应值不匹配的数,那么left = middle + 1一定会指向这个数。

代码展示:
class Solution {public int takeAttendance(int[] records) {int left = 0;int right =records.length;while(left < right) {int middle = left + (right - left) / 2;if(records[middle] == middle ) {left = middle + 1;}else {right = middle;}}return left;}
}

这篇关于二分法题集2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882960

相关文章

Recording题集

阶段1000-1300 Problem - 2002C - Codeforces //如果圆比点先到,则不可能进入#include<bits/stdc++.h>#define int long longusing namespace std;#define pii pair<int,int>signed main() {const int N = 1e5 + 7;//最多一个循环

数据结构基础之《(3)—二分法》

一、认识二分法 1、经常见到的类型是在一个有序数组上,开展二分搜索 2、但有序真的是所有问题求解时使用二分的必要条件吗?不 3、只要能正确构建左右两侧的淘汰逻辑,你就可以二分 二、二分法怎么用 1、在一个有序数组中,找某个数是否存在 public static boolean exist(int[] sortedArr, int num) {if (sortedArr == null |

Java题集(由入门到精通)02

此系列文章收录大量Java经典代码题(也可以算是leetcode刷题指南),希望可以与大家一起努力学好Java。3、2、1,请看! 目录 1.判断某个数是否是素数 2.打印棋盘 3.输出n以内所有亲密数 1.判断某个数是否是素数 分析:素数只能被1和它本身整除。以36为例,2×18=36,判断36被2整除的同时相当于也判断了它能被18整除,依此类推,3×12=36,4×9=36,

【递归、回溯专题(三)】记忆化搜索题集

文章目录 1. 斐波那契数2. 不同路径2. 不同路径3. 最长递增子序列4. 猜数字大小II 1. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n

Kotlin 二分法算法游戏--猜价格

本人最新想学习算法,算法是提高程序性能的关键! 程序就是数据结构和算法! 写了一个二分法的游戏,供大家参考: 当然,语言基于kotlin import java.util.*/*** Created by Administrator on 2017/10/18.*/fun main(args: Array<String>) {// println("请输入商品真实价格")//

二分法变种

package compublic class Test {public static void main(String[] args) {int[] nums = {4,7,7,9,12,13};int index = searchLastSmaller(nums,1);System.out.println(index);}/** 第一个与key相等的元素*/public static int

python基础-递归、二分法查找(for\递归)、三级菜单、压栈思想

递归方法二分法查找 通过for循环实现通过递归实现 递归应用–三级菜单压栈 递归方法 # age(1) n = 1 age(2)+2# age(2) n = 2 age(3)+2# age(3) n = 3 age(4)+2# age(4) n = 4 40def age(n):if n == 4:return 40return age(n+1)+2print

PTA - C语言接口题集

目录 6-1 计算两个复数之积(结构体函数)6-2 字符定位(返回字符的地址,指针)6-3 求结构体平均成绩(变量名(数组名)用.;指针(带有*)用->)6-4 删除字符串中数字字符6-5 使用函数找出数组中的最大值6-6 在数组中查找指定元素6-7 按等级统计学生成绩6-8 学生成绩比高低6-11 mystrcpy6-12 mystrcat6-13 mystrcmp6-14 求正整数的因子

LeetCode题集-1- 两数之和

这个题目是什么意思呢?简单来说就是在一个数组中找出两个元素,使其和为我们设定的值,并且每个元素只能用一次。 如下图具体示例: 到这里不知道你是否已经有解题思路了呢? 解法一:双层循环 我第一反应就是双层循环,直接暴力破解。因为题目要求每个元素只能使用一次,并且已经计算过的也没必要再次计算,因此内层循环索引起始可以以外层索引+1作为起始点,具体代码如下: public stati

暴搜、深搜、回溯算法题集

文章目录 1. 全排列2. 全排列II3. 子集4. 子集II5. 找出所有子集的异或总和再求和6. 电话号码的字母组合7. 括号生成8. 组合9. 目标和10. 组合总和11. 组合总和II12. 组合总和III13. 字母大小写全排列14. 优美的排列15. N 皇后16. 有效的数独17. 解数独18. 单词搜索19. 黄金矿工20. 不同路径III 1. 全排列 st