Day71:二分查找

25 阅读2分钟

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

提示:

  • 你可以假设 nums 中的所有元素是不重复的。
  • n 将在 [1, 10000]之间。
  • nums 的每个元素都将在 [-9999, 9999]之间。

思路


因为是无重复元素的有序序列(升序),故采用二分查找算法去实现是时间复杂度较好的一种方法,其中无重复元素的目的是为了保证每次的返回的下标都是唯一的。

public static void main(String[] args) {
    int nums[] = {2, 3, 5, 6, 21, 23, 29};
    System.out.println(binsearch(nums,0,nums.length-1,50));
}
static int binsearch(int num[],int left,int right,int target){
    if (left <= right) {
        int mid = (left + right) >> 1;
        if (num[mid] == target) return mid;
        if (num[mid] > target) return binsearch(num, left, mid - 1, target);
        if (num[mid] < target) return binsearch(num, mid + 1, right, target);
    }
    return -1;
}

给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变,不需要考虑数组中超出新长度后面的元素。

例如:给定nums=[0,1,2,2,3,0,4,2],val=2,函数应该返回新的长度5,并且nums中的前五个元素为 0, 1, 3, 0, 4。 你不需要考虑数组中超出新长度后面的元素。

示例

输入
3 2 2 3
3
输出
2
复制代码

思路

  • 首先输入数组元素和val,定义一个cnt值,并赋值为0,用来计算元素个数,即数组长度。
  • 然后遍历数组,当元素值与val不同时,cnt++,当元素值与val值相同时,把其设置为最大值。
  • 最后输出cnt,将数组排序。

具体实现

public static void main(String[] args) {
    int txt[] = {3,2,2,3};
    int count = delInArr(txt,2);
    for (int i = 0;i < count;i++){
        System.out.print(txt[i]+" ");
    }
}
static int delInArr(int num[],int val){
    int count = 0;
    for (int i = 0;i < num.length; i++){
        count += num[i] == val ? 1 : 0;
        num[i] = num[i] == val ? Integer.MAX_VALUE : num[i];
    }
    Arrays.sort(num);
    return count;
}