首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每天一道leetcode-81

每天一道leetcode-81

作者头像
乔戈里
发布于 2019-09-17 06:24:18
发布于 2019-09-17 06:24:18
38800
举报
文章被收录于专栏:Java那些事Java那些事
运行总次数:0

前言

目前准备每天刷一道题leetcode的题目,以此来激励那些零基础入门的人,千万不要被什么科班和非科班的说法吓倒了,计算机这个行业只要你肯努力,没有什么逾越不了的鸿沟。

只要你肯努力,一份努力,一份汗水,在程序员这个职业,你的每一份付出都会得到对应的那一份汇报,尊重学习规律,循序渐进,别想着一口吃个胖子,罗马也不是一天建成的,有朝一日,你终会变成你想成为的人。

题目目前可能需要一定的算法与数据结构基础才能看懂,后序会写一下零基础也能看懂的入门知识,然后就可以看懂我编写的题目了~

案例

题目

leetcode-81 在有重复数字的有序数组中寻找n

tag(分类): 二分查找这一类

链接:

https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

题目详述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false

示例 1:

代码语言:javascript
代码运行次数:0
运行
复制
输入: nums = [2,5,6,0,0,1,2], target = 0输出: true

示例 2:

代码语言:javascript
代码运行次数:0
运行
复制
输入: nums = [2,5,6,0,0,1,2], target = 3输出: false

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

题解

先上代码~

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public boolean search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right)
        {
            int mid = left + (right-left)/2;
            if(nums[mid] == target || nums[left] == target || target == nums[right])
                return true;
            if(nums[mid] > nums[left])
            {
                if(target > nums[mid])
                     left = mid + 1;
                else{
                    if(target > nums[left])
                        right = mid - 1;
                    else
                        left = mid + 1;
                }
            }else if(nums[mid] < nums[left])
            {
                if(target < nums[mid])
                    right = mid -1;
                else{
                    if(target > nums[left])
                        right = mid - 1;
                    else
                        left = mid + 1;
                }
            }else{
                left++;//right--;
            }
        }
        return false;
    }
}

上一篇题目:每天一道leetcode-33

本道题目是对上一篇题目的加强版,在有序数组的中加入了有重复数字这一条件,题目变得稍微难了一些些,思路也是很类似的,就是分情况讨论。

对于这种题目,数组,有序这两个字眼结合起来,就是要第一时间考虑到二分查找。

先举个例子,假设有旋转数组[3,3,3,4,5,6,1,2,3,3],以图形化的方式表示出这个数组,3,3,3,4,5,6为前半段,1,2,3,4为后半段,后续的图不是这个数组。

思路:由于无法确定target,nums[mid]谁大谁小,以及target和nums[mid]到底在前半段,还是在后一段,不同的情况下,对于令left = mid+1还是right = mid-1是不一样的情况,所以这里分情况进行讨论,把所有的情况讨论一遍,然后就知道,到底是变化left还是变化right,进而去缩小这个区间,找到我们要找到的数,在这里唯一不同的就是多了一种nums[mid]与nums[left]如果相等了的情况,该怎么处理。

nums[mid] >nums[left]

第10行,nums[mid]>nums[left]判断为真,说明nums[mid]在前半段。如下图所示

target>nums[mid]

紧接着到了12行,target>nums[mid],看图得知,target只能是在前半段。

所以观察得知,令left=mid+1往target去逼近。

target<nums[mid]

当12行代码判断为假,也就是要进入到14行。

而target小于nums[mid]时候,由于不知道target是在前半段还是后半段,所以的分情况讨论。

target<nums[mid]且target在前半段

当target在前半段,也就是代码第15行,target>nums[left],如下图所示。

观察图可知,16行,明显应该令right=mid-1,right减小去往target逼近。

target<nums[mid]且target在后半段

当target在后半段,也就是代码15行判断为假,也就是nums[left]>target,进入到18行。

观察图可知,明显应该是left=mid+1,来往target去逼近。

到这,10-20行代码解读完毕。

nums[mid]<nums[left]

当第10行代码判断为假,也就是nums[mid]<nums[left],nums[mid]落入到后半段,此时进入到代码21这个分支。如下图所示。

由于不知道target与nums[mid]的关系得分情况讨论。

target<nums[mid]

当target<nums[mid]时候,也就22行代码,观察上图得知,target只能在后半段,如下图所示。

明显应该是right=mid-1,来逼近taeget. ,23行代码所示。

target>nums[mid]

当22行代码判断为假,进入到25行代码,也就是target大于nums[mid]。

当target大于nums[mid]的时候,target可以在前半段大于nums[mid],也可以在后半段大于nums[mid],所以得分两种情况讨论。

target>nums[mid]且target在前半段

target在前半段,也就是代码25行,target>nums[mid]

如上图所示,明显令right=mid-1去逼近target,也就是代码26行。

target>nums[mid]且target在后半段

target在后半段,也就是代码25行判断为假,target<nums[left],进入到28行.

观察图得知,left=mid+1;

nums[mid]=nums[left]

当着二者相等的时候,无法讨论,这是为啥呢?

这里举个例子,帮助大家理解。

对于数组

[3,3,3,3,4,5,6,7],nums[mid]=nums[left]对吧,这时候如果要找6,target=6,那么应该是left=mid+1;往6去逼近。

而对于数组

[3,3,3,3,4,5,6,7,1,2,3,3,3,3,3,3,3,3,3,3,3,3],nums[mid]=nums[left]也是相等的对吧,但是这是候去找6,就应该是right=mid-1,去逼近这个6。

所以对于这种nums[mid]=nums[left]的情况你无法去确定nums[mid]是在前半段还是后半段没所以也就无法讨论。

所以只能是一次移动一个去逼近target,也就是代码31行,left++;或者right--都可以去去逼近target。

结束语

总体来说思路与leetcode31这道理差不多,但是多了一个nums[mid]=nums[left]的情况,把这个情况单独拿出来谈论即可。

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
C# Socket编程笔记
看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句。(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是,为了自己下一篇要写的文章做参考,还是有必要先补充一下socket基础知识。
zls365
2020/08/19
1.2K0
C# Socket编程笔记
C# 三种方式实现Socket数据接收(经典)
public abstract int Read(byte[] buffer, int offset, int count)
zls365
2021/01/14
8.3K0
C# 三种方式实现Socket数据接收(经典)
C# Socket TCP发送图片与接收图片
https://blog.csdn.net/yuhijk2055/article/details/87935783
zls365
2020/08/19
4.5K1
C# Socket TCP发送图片与接收图片
C# SOCKET发送和接收例子
Socket 客户端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace A0140_SocketClient.Sample { /// <summary> /// 这个类为一个 Socket 客户端的例子. /// 这个类简单的 连接到 Socket 服务器,并发送一段消息。 /
用户8671053
2021/11/03
2.8K0
C#中Socket的简单使用
一.Socket的概念 Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口.
全栈程序员站长
2022/09/07
1.3K0
C#中Socket的简单使用
Socket一些常用的方法封装
1 public class SocketHelper 2 { 3 /// <summary> 4 /// 功能描述:得到一个实例对象 5 /// </summary> 6 /// <returns>SocketHelper</returns> 7 public static SocketHelper GetSocketHelper() 8 { 9
冰封一夏
2019/09/11
6290
C# 一分钟浅谈:Socket 编程基础
在现代网络应用开发中,Socket 编程是一种非常重要的技术,它允许不同设备之间的应用程序通过网络进行通信。本文将从基础概念入手,逐步深入到 Socket 编程中的常见问题和易错点,并通过具体的代码示例来帮助读者更好地理解和掌握这一技术。
Jimaks
2024/10/18
3420
socket通信(C#)
4:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;
红目香薰
2022/11/29
1.1K0
socket通信(C#)
Socket
网络通信三要素: IP地址、端口号、传输协议 TCP、UDP协议 Socket通信流程: Server: 1.创建socket msocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 2.绑定socket和端口号 //创建一个IP对象 IPAddress iPAddress = IPAddress.Parse(ip);
祝你万事顺利
2019/05/29
1K0
C# socket通信实现两个控制台之间聊天
1、运行效果 图1 启动服务端 图2 启动客户端 图3 客户发消息 图4 服务端发消息 图5 客户主动关闭,服务段打印异常详情 2、服务器端源码 服务端和客户端都要添加一下namespace: using System.Net; using System.Net.Sockets; using System.Threading; 源码:  class Program     {         private static string serverIP = "192.168.3.42";
用户7705674
2021/11/03
9870
基于☀️TCP/IP协议的聊天实例
2、写入:write——服务器read 往服务器发送请求/向服务器写入账号密码等
星河造梦坊官方
2024/08/15
2370
基于☀️TCP/IP协议的聊天实例
面向对象(二十四)-Socket,TCP客户端、服务端简单聊天室
1. 服务端代码 // 1. 新建一个Socket 服务器端 连接对象 // 参数 寻址范围,数据类型,协议格式 Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] ip = { 192, 168, 199, 117 }; IPAddress address =
孙寅
2020/06/02
5530
【Golang】快速复习指南QuickReview(九)——socket
Socket网路编程对于B/S项目来说,几乎不会涉及;但是如果涉及游戏服务器开发,或者上位机服务器开发,自定义通信协议,Socket网络编程就变得常见了。
DDGarfield
2022/06/23
3430
项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载
Form的布局里央加入了三个textbox(Ftp的地址,Ftp的端口号和显示状态的文本框),三个button(生成文件,上传文件,下载文件的按钮),如下图:
Vaccae
2020/06/09
8530
项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载
基于Socket的网络聊天室编程(第一版)
一:什么是套接字 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Wi
用户1161731
2018/01/11
2.2K0
基于Socket的网络聊天室编程(第一版)
你也可以写个聊天程序 C# Socket学习
我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解。我今天就来和大家一起学习下Socket,并写一个简单的聊天程序。
郑子铭
2023/08/30
5310
你也可以写个聊天程序 C# Socket学习
监控IP和端口数据
winform客户端实现监控本机端口实现数据的发送和接收 #region 无连接给本机端口发送消息 public void local() { byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区 string stringData; IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("172.23.13.36"), 8082);
十分钟空间
2022/08/17
1.5K0
一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
2.Socket对象的RemoteEndPoint、 LocalEndPoint都是这个类型
WeiMLing
2019/08/23
1.3K0
一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
C# 温故而知新:Stream篇(七)
NetworkStream 目录: NetworkStream的作用 简单介绍下TCP/IP 协议和相关层次 简单说明下 TCP和UDP的区别 简单介绍下套接字(Socket)的概念 简单介绍下TcpClient,TcpListener,IPEndPoint类的作用 使用NetworkStream的注意事项和局限性 NetworkStream的构造 NetworkStream的属性 NetworkStream的方法 NetwrokStream的简单示例 创建一个客户端向服务端传输图片的小示例 本章总结 1.
逸鹏
2018/04/10
1.6K0
C# 温故而知新:Stream篇(七)
ios 接收 c# socket udp 组播
最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目  用udp 组播 让ios多终端接收和刷新方法 做一个简单的小例子会把工程给大家下载的   c#代码:netSocketUDP.rar      ios代码:MyIOSSocketDemo.rar 先用c#做发送 组播IP范围为 224.0.0.0~239.255.255.255 建一个控制台应用程序 private static IPAddress GropuAddress = IPAddress.Parse("224.0.0.2");//I
lpxxn
2018/01/31
2.6K0
相关推荐
C# Socket编程笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档