前言
前一段时间学习二分思想有感,再加上整个人比较emo所以在这里分享这些东西。
我的理解
在刚开始学习的阶段,肯定就是在一个有序数组中找对应数字的下标。这个题目我们可以直接找,但是这样是不是没有利用到有序数组的特性呢?就像猜数游戏一样,假设猜一个1-100之间的数(假设会提示你大小关系),我们会选择从1一直猜到100吗?大概率是不会的,你肯定会试探性的选择一个数字,比如说46这样的数。但是你如果再理性一点,你就会发现猜50是最好的,然后根据大小关系就能继续缩小范围,根据这样的猜法,我们只需要最多log2100约等于9次就能成功。然后你就可以拿着这份思路去写二分最简单的题目了。
//题目如下给定一个 `n` 个元素有序的(升序)整型数组 `nums` 和一个目标值 `target` ,写一个函数搜索 `nums` 中的 `target`,如果目标值存在返回下标,否则返回 `-1`。
int binarySearch(int a[], int n, int x) {
if (n > 0 && x >= a[0]) {
int low = 0, high = n - 1;
while (low < high) {
int mid = (low + high + 1) / 2;
if (x < a[mid])high = mid - 1;
else low = mid;
}
if (x == a[low])return low;
}
return -1;
}
在这里还要注意一下写法,就是新手可能会弄错区间使得数组不能返回,甚至是越界的情况。所以你得在写之前想清楚怎么写,注意什么就好了。
总结
二分是算法中比较简单的一种,但是里面涉及到的分治思想和其中的一些本质明日继续。
`