代码随想录算法训练营day1,二分查找,移除元素练习心得体会

221 阅读1分钟

1 二分查找

二分查找题目链接

1.1 二分查找的使用前提

  • 1.数组为有序数组
  • 2.数组中无重复元素

1.2 左闭右闭的写法-[L,R]

/**左闭右闭写法
 * @param nums   传入一个有序数组
 * @param target 需要找到的目标数字
 * @return 返回的是target在数组中的index,若返回-1表示没有找到
 */
public static int searchBySlp01(int[] nums, int target) {
    int left = 0;//左边界
    int right = nums.length - 1;//右边界
    //前提处理 判断目标数字是否在区间内
    if (target < nums[0] || target > nums[nums.length - 1]) {
        return -1;
    }
    while (left <= right) {
        int middle = (left + right) / 2;
        if (nums[middle] > target) {
            right = middle - 1;
        } else if (nums[middle] < target) {
            left = middle + 1;
        } else if (nums[middle] == target) {
            return middle;
        }
    }
    return -1;
}

1.3 左闭右开的写法-[L,R)

/**左闭右开写法 [L,R)
 * @param nums   传入一个有序数组
 * @param target 需要找到的目标数字
 * @return 返回的是target在数组中的index,若返回-1表示没有找到
 */
public int searchBySlp02(int[] nums, int target) {
    int left = 0, right = nums.length;
    //因为是左闭右开写法 [L,R) 所以L,R相等是矛盾的,所以只写<就行
    while (left < right) {
        int mid = left + ((right - left) >> 1);
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            /**
             * 为什么不写成left = mid;
             * 原因:因为num[mid] < target,所以L要往右移动到mid+1
             * ,不是移动到mid是因为nums[mid] != target,那么把left=mid纳入循环没有意义
             */
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid;
        }
    }
    return -1;
}

2 移除元素

移除元素题目链接

2.1 暴力解法

//暴力解法
public void removeBySlp01(int[] nums, int val) {
    int size = nums.length;
    for (int i = 0; i < size; i++) {
        if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
            for (int j = i + 1; j < size; j++) {
                nums[j - 1] = nums[j];
            }
            nums[size - 1] = 0;
            i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
            size--; // 此时数组的大小-1
        }
    }
    System.out.println("size=" + size);
    System.out.println("====数组====");
    for (int i = 0; i < nums.length; i++) {
        System.out.println(nums[i]);
    }
}

2.2 双指针法

//双指针法
public void removeBySlp02(int[] nums, int val) {
    //慢指针:指向更新 新数组下标的位置
    int slow = 0;
    //寻找新数组的元素 ,新数组就是不含有目标元素的数组
    for (int fast = 0; fast < nums.length; fast++) {
        if (nums[fast] != val) {
            nums[slow++] = nums[fast];
        }
    }
    System.out.println("size=" + slow);
    System.out.println("====数组====");
    for (int i = 0; i < slow; i++) {
        System.out.println(nums[i]);
    }
}