【NOWCODE SEVEN】:二分查找/排序

🤵Author:今日说“法”

🏆主攻领域:算法分析与设计

📰个人主页:今日说"法"的博客
📝系列专栏:NOWCODE系列

⚡️前言

        一位大佬曾经说过:程序=数据结构+算法  ,数据结构相当于一套普遍适用的工具,算法相当于一套行之有效的解题方法和解题步骤。Dambisa Moyo 曾经说过:“种一颗树最好的时间是十年前,其次是现在。”所以十年前没有刷题的朋友,现在跟着博主一起刷题吧。

工具介绍:数组


定义

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

结构

数组=一块连续的存储空间,我们假想数据下方有下标
 

优缺点

优点:查询/查找/检索其个下际上的元素时效事极高。可以说是查询效事最高的一个数据结构。

为什么检索效事高?

第一:每一个元素的内存地址在空间存储上是连续的。

第二:每一个元素类型相同,所以占用空间大小一样。

第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效事是最高的。

数组中存储100个元责,或者存结100万个元素,在元素查询/检索方面,效事是相同的。因为数组中元责查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个内存地址,随接定位的。)

缺点:

第一:由于为了保证数组中每个元素的内存的加连续,所以在数组上随机制除或者增加元素的时候效事较纸,因为随机增别元责会涉及到后面元素统一向前或者向后位移的操作。

第二:数组不能存能大数据最,为什么?

因为很难在内存空间上找到一块特别大的连续的内存空间。

注意:对于数组中最后一个元素的增别,是没有效事影啊的。

CODE Exercise:

One:二分查找-I

难度:⭐⭐⭐ 

时间限制:1秒

空间限制:256M

 

描述

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

数据范围:0≤len(nums)≤2×10^5 , 数组中任意值满足 ∣val∣≤109

进阶:时间复杂度 (logn) ,空间复杂度 O(1)

示例1

输入:[-1,0,3,4,6,10,13,14],13

返回值:6

说明:13 出现在nums中并且下标为 6

示例2

输入:[],3

返回值:-1

说明:nums为空,返回-1

示例3

输入:[-1,0,3,4,6,10,13,14],2

返回值:-1

说明:2 不存在nums中因此返回 -1

备注:

数组元素长度在[0,10000]之间

数组每个元素都在 [-9999, 9999]之间。

Submit(python)

 


class Solution:
    def search(self , nums: List[int], target: int) -> int:
        # write code here
        if len(nums)==0:
            return -1
        lenth_low=0
        lenth_high=len(nums)-1
        lenth_haf=(lenth_low+lenth_high)//2
        while lenth_low<=lenth_high:
            lenth_haf=(lenth_low+lenth_high)//2
            if target==nums[lenth_haf]:
                return lenth_haf
            if target>nums[lenth_haf]:
                lenth_low=lenth_haf+1
                
            if target<nums[lenth_haf]:
                lenth_high=lenth_haf-1
        return -1

Two: 二维数组中的查找

难度:⭐⭐⭐ ⭐ 

时间限制:1秒

空间限制:256M 

描述

在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

[

[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

数据范围:矩阵的长宽满足5 0≤n,m≤500 , 矩阵中的值满足 0≤val≤10^9
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)

 

示例1

输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

返回值:true

说明:存在7,返回true

示例2

输入:1,[[2]]

返回值:false

示例3

输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

返回值:false

说明:不存在3,返回false

Submit(python) 


class Solution:
    def Find(self , target: int, array: List[List[int]]) -> bool:
        # 利用list.count()查找数组中每一行的元素
        # 用len()取得行数
        for i in range(len(array)):
            if array[i].count(target):
                return True 
        return False

 

Three: 寻找峰值

难度:⭐⭐⭐ ⭐ 

时间限制:1秒

空间限制:256M

描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] =−∞

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

4.你可以使用O(logN)的时间复杂度实现此问题吗?

 

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

 

 

示例1

输入:[2,4,1,2,7,8,4]

返回值:1

说明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以

示例2

输入:[1,2,3,1]

返回值:2

说明:3 是峰值元素,返回其索引 2

Submit(python) 

 

class Solution:
    def findPeakElement(self , nums: List[int]) -> int:
        # write code here
        for i in range(1,len(nums)-1):
            if nums[i]>nums[i-1] and nums[i]>nums[i+1]:
                return i
        if max(nums)==nums[-1]:
            return len(nums) -1
        elif max(nums) == nums[0]:
            return 0

🔥结语

        ❄️ 冰冻三尺非一日之寒❄️,只刷一两天刷法可成不了编程界的耶路撒冷,千里之行始于足下,所以还是得坚持刷题阿,每天记得要上机哟!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值