朴素做法
一个朴素的做法,从前往后进行处理,直到遇到符合条件的位置。
代码:
import java.util.*; public class Solution { public int search (int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; i++) { if (nums[i] == target) return i; } return -1; } }
- 时间复杂度:
- 空间复杂度:
二分解法
利用数组本身有序,我们可以通过二分找插入位置。
具体的,通过二分找到符合 nums[mid] <= target
的分割点。注意二分完后需要再次检查是否位置是否符合条件,如果不符合,代表插入元素应该被添加到数组结尾。
代码:
import java.util.*; public class Solution { public int search (int[] nums, int target) { int n = nums.length; if (n == 0) return -1; int l = 0, r = n - 1; while (l < r) { int mid = l + r + 1 >> 1; if (nums[mid] <= target) l = mid; else r = mid - 1; } return nums[r] == target ? r : -1; } }
- 时间复杂度:
- 空间复杂度:
最后
这是我们「必考真题 の 精选」系列文章的第 No.160
篇,系列开始于 2021/07/01。
该系列会将牛客网中「题霸 - 面试必考真题」中比较经典而又不过时的题目都讲一遍。
在提供追求「证明」&「思路」的同时,提供最为简洁的代码。
欢迎关注,交个朋友 (`・ω・´)