计算机创新协会冬令营——暴力枚举题目03
2024-01-08 22:16:01
经过昨天两道题目的洗礼今天应该是更加的手到擒来吧。接招!
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为?
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~
文章来源:https://blog.csdn.net/DDDDWJDDDD/article/details/135386832
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!