初步题解
704 二分查找
题目链接:https://leetcode.cn/problems/binary-search/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class LE704 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] nums = Arrays.stream(scanner.nextLine().split(",")) .mapToInt(Integer::parseInt) .toArray(); int target = Integer.parseInt(scanner.nextLine()); System.out.println(search(nums, target)); } public static int search(int[] nums, int target) { for (int i = 0, j = nums.length - 1; i <= j; ) { int k = (i + j) / 2; if (nums[k] == target) { return k; } if (nums[k] > target) { j = k - 1; } else { i = k + 1; } } return -1; } }
|
27 移除元素
题目链接:https://leetcode.cn/problems/remove-element/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class LE27 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] nums = Arrays.stream(scanner.nextLine().split(",")) .mapToInt(Integer::parseInt) .toArray(); int val = Integer.parseInt(scanner.nextLine()); System.out.println(removeElement(nums, val)); } public static int removeElement(int[] nums, int val) { int i, j; for (i = 0, j = nums.length - 1; i <= j ; ) { while (j >= 0 && nums[j] == val) { j--; } while (i <= nums.length - 1 && nums[i] != val) { i++; } if (i < j) { int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } } return i; } }
|
看讲解
704 二分查找
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static int search(int[] nums, int target) { for (int i = 0, j = nums.length - 1; i <= j; ) { int k = i + (j - i) / 2; if (nums[k] == target) { return k; } if (nums[k] > target) { j = k - 1; } else { i = k + 1; } } return -1; }
|
27 移除元素
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
其实。。一开始看题目我没有反应过来暴力解法是什么。第一时间当然是想到 iterator().remove(),但是不行。老实说,那个题目里的 O(1) 额外空间我也不知道怎么算的。
暴力解法是双层循环,删除之后的所有都前移。
双指针和我想的也完全不一样,我也不知道我写的这个叫什么。。
1 2 3 4 5 6 7 8 9 10 11
| public static int removeElement(int[] nums, int val) { int i = 0; for (int j = 0; j < nums.length; j++) { if (val != nums[j]) { nums[i++]= nums[j]; } } return i; }
|
总结
其实都属于已经知道题解方式再去看题,加上是简单算法,所以感觉难度不是很大。(也可能我只是为了找工作,对我来说解出来就 OK)
二分查找
前提:
1、有序数组
2、数组中无重复元素
注意:
整数数值越界的问题