经过昨天两道题目的洗礼今天应该是更加的手到擒来吧。接招!
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为
O(log n)
的算法。(这里先不管,因为力扣这里的测试用例比较少,所以使用暴力枚举依然可以AC题目,我等一下会给出复杂度为logn的方法,对就是二分)
示例
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
Java题解一:暴力枚举
其实这种找什么值的方法,只要是测试用例比较小的,都可以用暴力枚举跑出来,当然了,一般都会有对应的优化方法。这里只需要挨个的找寻目标值或者需要插入的位置即可。一层for循环,比较简单。
class Solution {public int searchInsert(int[] nums, int target) {int res = 0;// 由题目可知,已经是排序数组了,单调递增for (int i = 0; i < nums.length; i++) {// 如果等于目标值if (nums[i] == target){res = i;}// 不等于,但是符合在中间插入的条件if ( i < nums.length - 1 && nums[i] < target && target < nums[i + 1]){res = i + 1;}}// 上面两种情况都不满足,但是满足尾部插入的条件if (target > nums[nums.length - 1]){res = nums.length;}return res;}
}
Java题解二:二分查找
在冬令营之后会涉及到二分查找,这也是比较基础的算法内容,因此现在可以理解一下,如果不理解的话先看看,毕竟“熟读唐诗三百首,不会作诗也会吟”是吧,有余力的同学可以看一看。
而且仔细观察题目,要求使用logn复杂度的算法,说的就基本上是二分了
class Solution {public int searchInsert(int[] nums, int target) {//其实在这里看见是一个logn级别的算法那么就已经说明了//这道题需要使用二分查找了int left = 0;int right = nums.length - 1;//在这里采用左闭右闭的原则int middle = 0;while(left <= right){middle = left + (right - left) / 2;if(nums[middle] > target){// 右指针移动right = middle - 1;}else if(nums[middle] < target){// 左指针移动left = middle + 1;}if(nums[middle] == target){// 找到目标值return middle;}}return left;}
}
其他语言解法
C++
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int res = 0;// 由题目可知,已经是排序数组了,单调递增for (int i = 0; i < nums.size(); i++) {// 如果等于目标值if (nums[i] == target) {res = i;}// 不等于,但是符合在中间插入的条件if (i < nums.size() - 1 && nums[i] < target &&target < nums[i + 1]) {res = i + 1;}}// 上面两种情况都不满足,但是满足尾部插入的条件if (target > nums[nums.size() - 1]) {res = nums.size();}return res;}
};
Python3
class Solution:def searchInsert(self, nums: List[int], target: int) -> int:res = 0# 由题目可知,已经是排序数组了,单调递增for i in range(len(nums)):# 如果等于目标值if nums[i] == target:res = i# 不等于,但是符合在中间插入的条件if i < len(nums) - 1 and nums[i] < target and target < nums[i + 1]:res = i + 1# 上面两种情况都不满足,但是满足尾部插入的条件if target > nums[-1]:res = len(nums)return res
总结
简单的遍历,可以适当理解一下二分。
ヾ( ̄▽ ̄)Bye~Bye~