前置知识(涉及知识点,文章后面会讲解)
栈,堆的存储变化、方法(变量作用域、方法调用)、数组(内存分析)、while循环、if分支、标识符的中文含义
复杂的问题下是无数的简单问题,简单问题之下,是无可撼动的底层原理和知识,不断分析背后的运用到的底层知识,方可将其总结成解决问题的模型,以此来解决更多的复杂问题。
二分查找
含义
将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;
如果x<a[n/2],则只要在数组a的左半部分继续搜索x
如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度即是while循环的次数。
a[]为数组,[]内为数组下标
理解
每次循环时,要寻找的元素减半
比较的是减半后的元素集合的中间元素与目标元素
通过不断地消减一半元素,查询目标元素和剩余一半元素的中间元素实现低复杂度
要解决的问题
获得一个 在一个有序且无重复元素的数组中用二分法快速定位一个目标元素下标 的方法
解决方案
1、设置3个变量存储数组的左、右、中间的元素的变化
2、if分支判断目标条件是否成立,若不成立则执行被查找元素减半变化
3、while循环,在目标未实现和合理条件下,多次执行 1、2的变化
方法类:

代码
public class Solution {
public int solution(int[] arr,int target){
if(target<arr[0]||target>arr[arr.length-1]){
System.out.println("数组中无该数字");
return -1;
}
int left=0;
int right=arr.length-1;
while (left<=right){
int middle=(left+right)/2;
if(target==arr[middle]){
return middle;
}else if(target<arr[middle]){
right=middle-1;
}else {
left=middle+1;
}
}
return -1;
}
}
测试类:

代码:
public class test {
public static void main(String[] args) {
int[]arr={1,2,3,4,5,6,7,8,9};
int target=3;
Solution solution=new Solution();
System.out.println(solution.solution(arr,target));
}
}
前置知识讲解(本文涉及的知识)
栈,堆的存储变化
栈:内存的一个划分区域,用于存储变量、基本类型数据和引用数据类型的地址,同时运行方法。
堆:内存的一个划分区域,用于存储引用类型数据,例如对象,数组
数组表达式单语句分析:
int[] arr={0,1,2};

int num=arr[2];
定位地址后返回脚标对应连续地址存储的数字
arr【2】,首地址+跨过2个元素的内存地址,读取4个字节(根据int类型)
arr【a】,脚标a的含义是跨过多少数据类型字节的地址,并读取字节返回数值
方法(变量作用域、方法调用)
有参有返回值方法功能块分析:
int solution(int[] arr,int target){
...
int left=0;
int right=arr.length-1;
...
return -1;
}
left变量,底层是栈内存某处连续四个字节赋予 数字0的对应的二进制,right变量亦然
针对二分查找问题,left和right变量赋予 传入数组arr的左右边界元素对应的下标 意义
根据下标可定位堆内存的数组
下标变化,数组变化,故而实现抽象意义上的数组减半操作(右下标若变为中间元素下标,则中间元素下标到右边界元素下标之间的地址针对本题失去意义,无法寻找)
有参有返回值方法调用表达式单语句分析:
int index=solution(arr,target);
传入arr数组,target目标数字,用solution()方法功能块返回目标数字的下标
solution()方法功能块的作用是对 arr数组和target数字进行 抽象赋予意义并通过赋值单语句和if、while复合语句解决问题
变量作用域:
arr无法进行引用类型的地址操作,target 无法进行基本类型的赋值操作,因为他们是方法体外的变量,只能在方法体之外,类之内进行底层操作
while循环、if分支判断
while (left<=right){
int middle=(left+right)/2;
if(target==arr[middle]){
return middle;
}else if(target<arr[middle]){
right=middle-1;
}else {
left=middle+1;
}
}
实现功能:通过不断地消减一半元素,查询目标元素和剩余一半元素的中间元素实现低复杂度
结束消减情况:方法传入数组的抽象脚标失去意义
消减一半元素:通过抽象脚标的变化实现
奇数个数字的数组分析:
在数组:1,3,4,5,7,9,10中查找元素2

偶数个数字的数组分析:
在数组:1,3,4,5,7,9中查找元素2

标识符的中文含义
class Solution:解决方案类
solution():解决方法
right 左下标
left 右下标
target 目标值
middle 中间下标