剑指offer----C语言版----第七天

news2024/11/20 0:28:10

目录

1. 旋转数组中的最小数字

1.1 题目描述

1.2 思路一

 1.3 思路二

1.4 小试牛刀


1. 旋转数组中的最小数字

原题链接:

剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/

1.1 题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

1.2 思路一

从头到尾遍历数组,找出最小的元素即可。这种思路的时间复杂度是O(N),这种思路并没有利用旋转数组的特性,显然不是最优的解法。

int minArray(int* numbers, int numbersSize)
{
    int min = numbers[0];
    for(int i = 0; i < numbersSize; i++)
    {
        if(numbers[i]<min)
        {
            min = numbers[i];
        }
    }
    return min;
}

 1.3 思路二

如果在做题的过程中要求在排序的数组(或者部分排序的数组中)中查找一个数字或者统计某个数字出现的次数,那么我们都可以尝试使用二分查找算法。

我们发现旋转数组可以划分成两个排序的子数组,而且前面子数组的元素都大于或者等于后面子数组的元素(数组元素可以重复嘛)。并且最小的元素恰好是这两个子数组的分界线,根据题意我们可以利用二分查找算法实现O(logN)的查找。下面的折线图能帮助大家理解:

基于二分查找的基本思路,我们维护三个指针,begin,end,mid。一开始让他们分别指向数组的首元素,末尾的元素,和中间的元素,然后比较mid指向的元素与end指向的元素的大小关系:

情况一:mid指向的元素大于end指向的元素,根据上面发现的规律:前面的子数组大于等于后面的子数组。说明此时mid指向的元素在前面的子数组中,我们让begin = mid + 1 从而缩小查找的范围。

情况二:mid指向的元素小于end指向的元素,因为两个子数组都是升序序列(说非降序序列似乎更严谨),而end是指向待查找数组的末尾元素,所以mid必然是指向后面的子数组中的元素,此时我们令end = mid,缩小查找范围。为啥上面是begin = mid + 1,而下面是end = mid ,不是

end = mid - 1嘞,我们通过下面的例子来分析:

 

因为当mid恰好指向最小的元素时是属于情况二的,不存在令begin = mid + 1跳过最小值的情况。

情况三:当mid指向的值等与end指向的值:此时我们是没有办法判定最小值位于哪一边的。 

 

 此时我们令end - 1以这种方式更新mid的位置,虽然令end - 1丢失了一个数据,但是因为mid指向的元素与end指向的元素是相等的,无论丢失的数据是否是最小值,都无关紧要。切记不可以令begin++,因为我们比较的是mid与end之间的关系,end--不会丢失数据,但begin++会丢失数据,影响最终的结果。

关于返回值:因为循环结束时begin,end是相等的,所以我们返回begin指向的元素,或者end指向的元素都可以,注意:mid可不一定等于begin 或者 end,不可返回mid指向的元素。

还有一种情况就是当数组为非降序序列时,这个代码也能解决哦!但是做题一定要想到这种特殊的情况奥!

例如:1  2   3   4   5


int minArray(int* numbers, int numbersSize){
    int begin = 0;
    int end = numbersSize - 1;
    int mid;
    while(begin < end)
    {
        mid = begin + ((end - begin)>>1);
        if(numbers[mid] > numbers[end])
            begin = mid + 1;
        else if(numbers[mid] < numbers[end])
            end = mid;
        else
            end--;
    }
    return numbers[begin];
}

1.4 小试牛刀

链接:

33. 搜索旋转排序数组 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/search-in-rotated-sorted-array/

 这道题的关键就是确定target的位置,我觉得是这样哈!

int search(int* nums, int numsSize, int target){
    int begin = 0;
    int end = numsSize;
    while(begin < end)
    {
        int mid = begin + ((end - begin)>>1);
        if(nums[begin] < nums[mid])
        {
            if(nums[mid] > target && nums[begin] <= target)
            {
                end = mid;
            }
            else if(nums[mid]==target)
            {
                return mid;
            }
            else
            {
                begin = mid + 1;
            }
        }
        else
        {
            if(nums[mid] < target && nums[end-1]>=target)
            {
                begin = mid + 1;
            }
            else if(nums[mid]==target)
            {
                return mid;
            }
            else
            {
                end = mid;
            }
        }

    }
    return -1;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GCC学习笔记

&#xff08;1&#xff09;什么是GCC &#xff08;2&#xff09;用gcc编译文件 gcc test.c -o app 【编译test.c文件得到app可执行文件】 ./app 【运行可执行文件】 &#xff08;3&#xff09;编程语言的发展 &#xff08;4&#xff09;gcc工作流程 预处理 作用&#xff1a;…

剑指 Offer 26. 树的子结构

题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 给定的树 B&#xff1a; 返回 true&#xff0c;因为 B 与 A 的一个子树拥有相同的结构和节…

JavaScript中如何将十进制转换为十六进制?

​ 在本文中&#xff0c;我们将学习如何在 JavaScript 中轻松地将十进制数转换为其等效的十六进制数。 我们将研究一些需要执行此操作的真实场景。 数字toString() 方法 要在 JavaScript 中将十进制转换为十六进制&#xff0c;请对十进制调用 toString() 方法&#xff0c;将 1…

JUC并发编程学习笔记(四)callable接口与辅助类

6 Callable&Future 接口 6.1 Callable 接口 创建线程的多种方式&#xff1a; 继承Thread类实现Runnable接口Callable接口线程池 ​ 目前我们学习了有两种创建线程的方法一种是通过创建 Thread 类&#xff0c;另一种是通过使用 Runnable 创建线程。但是&#xff0c;Runn…

某电视 频道headers参数x-itouchtv-ca-signature逆向

本文仅供参考学习&#xff0c;如有侵权可联系本人 某电视(荔枝平台)平台逆向 目标链接 aHR0cHM6Ly93d3cuZ2R0di5jbi9jaGFubmVsRGV0YWlsLzI0Ng接口链接&#xff1a; aHR0cHM6Ly9nZHR2LWFwaS5nZHR2LmNuL2FwaS9jaGFubmVsL3YxL25ld3M/cGFnZVNpemU9NDAmY2hhbm5lbElkPTI0NiZjdXJy…

纯注解驱动SSM整合

纯注解驱动SSM整合 Jdbc.java package com.itheima.confing;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class J…

思购趣拼秒杀模式的逻辑与模式特点

读&#xff1a;小镇上来了一个陌生的年轻人&#xff0c;年轻人交了一百块定金给旅馆的老板去楼上挑房间&#xff0c;旅馆老板拿着这一百块钱还给了卖猪肉的&#xff0c;卖猪肉的把钱还给了卖饲料的&#xff0c;卖饲料的把钱还了厂商&#xff0c;厂商拿着钱还给了按摩店的小姐&a…

一文说清MySQL索引数据结构

前言 接上篇说到&#xff0c;小A匆匆忙忙的赶回宿舍&#xff0c;因为晚上他要给女神整理讲解MySQL中索引数据结构资料。一边整理一边忍住不笑了起来&#xff0c;等小美看到这篇文章不得爱上自己。当上小美男朋友&#xff0c;从此踏上人生巅峰不是梦&#xff08;该考虑一下孩子…

C#,图像二值化(12)——基于谷底最小值的全局阈值算法与源代码

1、基于谷底最小值的阈值 这个方法适用于通过有限的迭代次数&#xff0c;平滑后能得到双峰的图像&#xff0c;让双峰的谷底成为阈值。当执行完基于谷底最小值的阈值操作的时候&#xff0c;改变了直方图信息&#xff0c;使之成为处理过后的直方图信息&#xff0c;这时候显示Doc…

LeetCodeday05

面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; public class Leetcode0207 {public static void main(…

ChatGPT背后的模型

文章目录1.RLHF方法2.ChatGPT中的RLHF方法2.1 微调模型GPT-32.2 训练奖励模型2.3 利用强化学习进一步微调语言模型3.效果4.面临挑战5.参考InstructGPT语言模型&#xff0c;是一个比 GPT-3 更善于遵循用户意图&#xff0c;同时使用通过我们的对齐研究开发的技术使它们更真实、毒…

应急/linux 挂D盾扫描方法

0x00 linux 挂D盾扫描方法 这个方法可以解决Linux下无法使用D盾查杀webshell的困扰 利用ssh将Linux文件系统挂在到win上面&#xff0c;然后扫描就好了 0x01 环境安装 安装D盾 D盾都用过吧&#xff0c;应急经常用来扫一下是否存在 Webshell D盾下载地址 D盾防火墙 (d99ne…

python 性能优化

文章目录性能测试运行速度内存消耗并行加速分布式并行多线程多进程框架即时编译njitcase1 计算熵case2 找到最大概率类别case3 计算两两准确率GPU使用工具关于程序优化的第一个准则是“不要优化”&#xff0c;第二个准则是“不要优化那些无关紧要的部分”。性能测试 性能测试是…

4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;

题目来源于牛客网&#xff0c;完整工程源码&#xff1a;https://github.com/ningbo99128/verilog 目录 VL37 偶数分频 VL40 奇数分频&#xff08;占空比50%&#xff09; VL42 奇数分频&#xff08;任意无占空比&#xff09; VL41 任意小数分频 VL37 偶数分频 题目介绍 请…

https的相关知识,为什么https更加安全,为什么要对称与非对称加密,非对称加密的算法

目录 https相比于http更加安全&#xff0c;三个优势&#xff1a; 下面是一些必须知道的问题 1.对称加密与非对称加密&#xff1a; 2.对称加密的密钥SK如何产生和传输&#xff1a; 3.https有两套非对称加密 4.https的哈希一共用于两个地方 5.https的整个流程 https相比于ht…

ElasticSearch数据实时性原理分析与持久化

问题复现 现在有这么一种业务场景&#xff0c;需要将海量的数据通过Hive进行数据清洗并统计&#xff0c;最后落库到ES中&#xff0c;因为需要支持大数据量的分词&#xff0c;模糊搜索&#xff0c;所以考虑用ES而不直接放到Mysql中&#xff0c;前端需要直接对数据进行交互&…

Redis的自增也能实现滑动窗口限流?

文章目录限流核心原理以及代码基于Spring切面实现的注解版本限流是大家开发之路上一定会遇到的需求。比如&#xff1a;限制一定时间内&#xff0c;接口请求请求频率&#xff1b;一定时间内用户发言、评论次数等等&#xff0c;类似于滑动窗口算法。这里分享一份拿来即用的代码&a…

buildroot构建hisi平台根文件系统和工具链

buildroot构建hisi平台根文件系统和工具链 前面使用了arm-hisiv300-linux 工具链来作为Buildroot的外部工具链进行编译&#xff0c;然后遇到了很多编译问题。 https://blog.csdn.net/duapple/article/details/128516133?spm1001.2014.3001.5501 这里不使用hisi的工具链&…

Seata简介

小结&#xff1a; nacos 【name server】&#xff1a;注册中心&#xff0c;解决服务的注册与发现 nacos【config】&#xff1a;配置中心&#xff0c;微服务配置文件的中心化管理&#xff0c;同时配置信息的动态刷新 Ribbon&#xff1a;客户端负载均衡器&#xff0c;解决微服务集…

C++之引用类型,深浅拷贝构造

引用类型&#xff1a;给内存段取别名。 int m 10; //引用&#xff0c;给内存段取别名&#xff0c;所以需要给他一段内存段&#xff0c;而不只是声明。 int& n m;//不是赋值的意思&#xff0c;是别名的意思 想要在被调函数中修改主调函数中定义的变量的值时&#xff0c;…