算法:数组 #241125

76 阅读2分钟

初始link

二分查找

题目链接: leetcode#704

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

题目的前置条件为n个有序的元素,故可通过二分查找解题 找到中间的下标int mid = left + (right-left)/2

为什么不用(left+right)/2, 主要是为了防止int溢出,如果left、right都足够大,两数相加可能超过int的范围

/**
     * 注意区间的定义
     * @param nums
     * @param target
     * @return
     */
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left<=right) {
            int mid = left + (right-left)/2; // 注意移除的问题,得这样处理
            if (nums[mid] > target) { // 说明在区间的左侧
                right = mid-1;
            } else if (nums[mid] < target) { // 说明在区间的右侧
                left = mid + 1;
            } else {
                return mid; // 相等,直接返回下标
            }
        }
        return -1;
    }

移除元素

题目链接: leetcode#27

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

题目要求原地进行移除,而且只需要返回不等于val的元素数量,可以将元素不等于val的元素全部放在数组的前段,可以使用双指针的思路,一个指针fast进行数组的遍历,另一个指针slow,在其对应元素不等于val时与前面的指针进行赋值到当前指针,且指针slow往下走,这样就能保证slow指针之前的元素至不等于val了

public int removeElement(int[] nums, int val) {
        int slow = 0;
        for(int fast = 0; fast < nums.length; fast++) {
            if(val != nums[fast]) {
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }