数组的应用

一、二分查找法

  • 在一个有序的数字数组中查询一个元素的下标
    • 可以将数组分半,然后用中间那个值和要查询元素的值进行比较
      • 若相等则查出
      • 若小于该元素,则弃掉右半部分开始对左边的进行二分查找法
      • 若大于该元素,则弃掉左半部分开始对右边的进行二分查找法
      • 一直这样循环,直到查到为止 ,
      • 若查不到返回-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题
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;
    }
}

三、计数排序法

四、三路快排

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值