计算机创新协会冬令营——暴力枚举题目03

经过昨天两道题目的洗礼今天应该是更加的手到擒来吧。接招!

题目

35. 搜索插入位置 - 力扣(LeetCode)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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循环,比较简单。

java 复制代码
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复杂度的算法,说的就基本上是二分了

java 复制代码
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++
cpp 复制代码
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
python 复制代码
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~

相关推荐
luj_17684 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
木木子226 小时前
# 鸿蒙 ArkTS 实战:秒表 Stopwatch(示例 5)
数据结构·华为·list·harmonyos
geats人山人海7 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz8 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu8 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7989 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭9 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶9 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶9 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展