【经典算法】LeetCode 35. 搜索插入位置(Java/C/Python3/Golang实现含注释说明,Easy)

简介: 【经典算法】LeetCode 35. 搜索插入位置(Java/C/Python3/Golang实现含注释说明,Easy)

题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,如果找不到则返回可以将其插入的位置以保证数组仍然有序。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

输入: [1,3,5,6], 0
输出: 0

原题:力扣 35. 搜索插入位置

思路及实现

方式一:二分查找

思路

题目要求在一个有序数组中查找目标值,如果找不到则返回可以将其插入的位置以保证数组仍然有序。由于数组是有序的,所以我们可以使用二分查找算法来优化搜索过程。

二分查找的基本思路是,每次取数组的中间元素与目标值进行比较:

  • 如果中间元素正好是要查找的目标值,则搜索结束;
  • 如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

在二分查找的过程中,我们可以同时记录可以插入目标值的位置。如果目标值大于中间元素,说明目标值应该插入在右半部分的起始位置,这个位置正好是中间元素的下一个位置;如果目标值小于中间元素,说明目标值应该插入在左半部分的末尾位置,这个位置正好是中间元素的位置。

代码实现

Java版本
public class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 退出循环时,left > right,left 的位置就是可以插入 target 的位置
        return left;
    }
}

说明:

Java版本的实现中,我们定义了两个指针leftright,分别表示数组的起始位置和结束位置。在while循环中,我们计算中间位置mid,并根据nums[mid]与目标值target的比较结果来更新leftright的值。最终,当循环结束时,left的值就是可以插入target的位置。

C语言版本
int searchInsert(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left;
}

说明:

C语言版本的实现与Java版本类似,但是需要注意在C语言中,数组的大小需要作为函数的参数传递。

Python3版本
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left

说明:

Python3版本的实现也采用了二分查找的思路,并且使用了整数除法//来避免浮点数。

Golang版本
package main
import "fmt"
func searchInsert(nums []int, target int) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] ==target {
            return mid
        } else if nums[mid] < target {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return left
}
func main() {
    nums := []int{1, 3, 5, 6}
    target := 5
    result := searchInsert(nums, target)
    fmt.Println(result) // 输出: 2
}

说明:

Golang版本的实现与前面几种语言类似,同样使用了二分查找算法来寻找目标值或者插入位置。

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。二分查找每次都将搜索范围减半,因此时间复杂度是对数级别的。
  • 空间复杂度:O(1)。我们只使用了常量级别的额外空间来存储指针和中间变量。

方式二:线性搜索

思路

虽然题目中给出了数组是有序的,但我们也可以使用线性搜索(即遍历数组)的方式来解决问题。对于每个数组元素,我们比较它是否等于目标值,或者是否小于目标值以确定插入位置。

代码实现

Java版本
public class Solution {
    public int searchInsert(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= target) {
                return i;
            }
        }
        // 如果遍历完整个数组都没有找到目标值,说明目标值应该插入在数组末尾
        return nums.length;
    }
}

说明:

Java版本的实现中,我们遍历数组,一旦找到某个元素大于等于目标值,就返回当前位置。如果遍历完整个数组都没有找到,则返回数组长度,表示目标值应该插入在数组末尾。

C语言版本
int searchInsert(int* nums, int numsSize, int target) {
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] >= target) {
            return i;
        }
    }
    return numsSize;
}

说明:

C语言版本的实现与Java版本类似,但是需要注意在C语言中,数组的大小是作为函数的参数传递的。

Python3版本
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        for i in range(len(nums)):
            if nums[i] >= target:
                return i
        return len(nums)

说明:

Python3版本使用for循环遍历数组,一旦找到大于等于目标值的元素,就返回其索引。

Golang版本
package main
import "fmt"
func searchInsert(nums []int, target int) int {
    for i, num := range nums {
        if num >= target {
            return i
        }
    }
    return len(nums)
}
func main() {
    nums := []int{1, 3, 5, 6}
    target := 5
    result := searchInsert(nums, target)
    fmt.Println(result) // 输出: 2
}

说明:

Golang版本的实现使用range关键字遍历数组,与Python3版本类似。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。在最坏情况下,我们需要遍历整个数组才能找到插入位置。
  • 空间复杂度:O(1)。我们同样只使用了常量级别的额外空间来存储索引和中间变量。

总结

方式 优点 缺点 时间复杂度 空间复杂度
方式一(二分查找) 效率高,时间复杂度低 需要数组有序 O(log n) O(1)
方式二(线性搜索) 代码简单,容易理解 时间复杂度较高 O(n) O(1)

相似题目

相似题目 难度 链接
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 中等 力扣-34
相关文章
|
8天前
|
监控 算法 安全
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
|
24天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
86 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
1月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
309 55
|
1月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
127 66
|
6天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
34 17
|
15天前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
41 20
|
10天前
|
存储 人工智能 算法
深度解密:员工飞单需要什么证据之Python算法洞察
员工飞单是企业运营中的隐性风险,严重侵蚀公司利润。为应对这一问题,精准搜集证据至关重要。本文探讨如何利用Python编程语言及其数据结构和算法,高效取证。通过创建Transaction类存储交易数据,使用列表管理订单信息,结合排序算法和正则表达式分析交易时间和聊天记录,帮助企业识别潜在的飞单行为。Python的强大功能使得从交易流水和沟通记录中提取关键证据变得更加系统化和高效,为企业维权提供有力支持。
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
152 67
|
9天前
|
存储 算法 安全
U 盘管控情境下 Python 二叉搜索树算法的深度剖析与探究
在信息技术高度发达的今天,数据安全至关重要。U盘作为常用的数据存储与传输工具,其管控尤为关键。本文探讨Python中的二叉搜索树算法在U盘管控中的应用,通过高效管理授权U盘信息,防止数据泄露,保障信息安全。二叉搜索树具有快速插入和查找的优势,适用于大量授权U盘的管理。尽管存在一些局限性,如树结构退化问题,但通过优化和改进,如采用自平衡树,可以有效提升U盘管控系统的性能和安全性。
18 3
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
144 61