一、二分查找法
- 在一个有序的数字数组中查询一个元素的下标
- 可以将数组分半,然后用中间那个值和要查询元素的值进行比较
- 若相等则查出
- 若小于该元素,则弃掉右半部分开始对左边的进行二分查找法
- 若大于该元素,则弃掉左半部分开始对右边的进行二分查找法
- 一直这样循环,直到查到为止 ,
- 若查不到返回-1
- 可以将数组分半,然后用中间那个值和要查询元素的值进行比较
public int Binary(int[] arr,int ele) throws IllegalAccessException {
int index = 0;
//判断数组是否为空
if (index < 0 || index > arr.length-1) {
throw new IllegalAccessException("array is error!");
}
int l = 0;
int r = arr.length-1;
while (l<=r){
int mid = l + (r - l) / 2;
if (arr[mid] > ele) {
r = mid - 1;
} else if (arr[mid] < ele) {
l = mid + 1;
} else {
return mid;
}
}
return -1;
}
二、双向链表
-
百分之85的数组问题都可以用双向链表来解决,
-
而时间复杂度真的低,
-
根据不同的问题会有不同的时间复杂度
-
思想:
- 我们创建两个指针i和j,指针i用来遍历数组,指针j用来记录当前需要移除的元素。
- 一开始指针i,j都指向第一个数字,然后进行遍历
- 第一个数组若是需要移除的元素,i指针直接跳到第二个元素中,j指针不变为当前要插入的元素位置
- 若第二个元素不是需要移除的元素,则判断i,j指针是否在同一个元素中.
- 若不在同一个位置则i位置的元素将覆盖掉j位置的元素
- 如上述一样一直循环,直到i指针到最后一个元素,
- 此时j指针所指元素位置即下一个需要插入的位置,
- j指针当前索引即为元素总长度
-
如 力扣27题所示
- 原地移除所有数值等于 val 的元素
力扣27题
- 原地移除所有数值等于 val 的元素
public class Array27 {
//双向指针--采取交换的方式(i 遍历数组的指针 j 指向待放置非指定元素的位置[指定元素的个数])
public int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) {
new IllegalArgumentException("The Array is empty.");
}
// 第一次遍历:声明两个指针
int i = 0, j = 0;
for (;i<nums.length;i++){
if (nums[i] != val){
if (i!=j){
nums[j] = nums[i];
}
j += 1;
}
}
return j;
}
}