代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

YOLOv9原创自研:卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力 为了进一步提升小目标检测能力,风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力 阅读详情

题目与思路:

704. 二分查找

主要练习左闭右闭写法和左闭右开写法,注意边界条件处理。比较好理解,除了很久没有写代码遇到了indent报错的问题,其余比较顺利,贴上两种写法的代码:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        #左闭右闭
        left, right = 0, len(nums) - 1
        #左闭右闭左右界相等时仍有1个元素,需要继续循环。
        while left <= right: 
            #防止相加溢出,实际上在本题中不会。
            mid = (right - left) // 2 + left
            if nums[mid] == target:
                return mid
            #目标值比中值小,在当前区域的左半边
            elif nums[mid] > target: 
                #更新上界,右闭区间的上界参与计算因此要去除本次已计算过的mid
                right = mid - 1 
            #目标值比中值大,在当前区域的右半边
            else: 
                left = mid + 1
        #未找到,返回-1
        return -1
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        #左闭右开
        left, right = 0, len(nums)
        #左闭右开左右界相等时没有元素,不需要继续循环。
        while left < right: 
            #防止相加溢出,实际上在本题中不会。
            mid = (right - left) // 2 + left
            if nums[mid] == target:
                return mid
            #目标值比中值小,在当前区域的左半边
            elif nums[mid] > target: 
                #更新上界,右开区间的上界不参与计算因此直接用mid代替
                right = mid
            #目标值比中值大,在当前区域的右半边
            else: 
                left = mid + 1
        #未找到,返回-1
        return -1

思考本题的拓展练习35.搜索插入位置和34. 在排序数组中查找元素的第一个和最后一个位置的时候考虑研究二分法在找不到元素时left和right的终点在哪里。得到结论如下:

  • 左闭右闭区间:查不到元素时,有三种情况,第一种情况target在区间左边外边,target<min(nums),此时显然left=0,而right=-1;第二种情况target在区间右边外边,target>max(nums),此时left=len(nums),而right=len(nums)-1;第三种情况target在区间内,min(nums)<target<max(nums),此时不妨假设数组中连续的两个值m和n有m<target<n,最终循环停止时必定有left=index(m),而right=index(n)。
  • 左闭右开区间:也是类似三种情况,第一种情况有left=right=0,第二种情况有left=right=len(arr),第三种情况,由于右开,因此最后一次更新时必定更新下界,于是必有left=right=index(n)

由于二分查找的停止条件有以上特性,可以用于解决拓展练习:

35.搜索插入位置直接使用左闭右开区间,除了元素在数组内返回mid,其余情况只需返回left即是第一个大于target的位置。代码如下:

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums)

        while left < right:
            mid = (right - left) // 2 + left
            if target > nums[mid]: left = mid + 1
            elif target < nums[mid]: right = mid
            else: return mid

        return left

34. 在排序数组中查找元素的第一个和最后一个位置,这是要找边界,首先考虑一般情况,target在数组内,我们在找到target的时候不去return,而是继续更新边界:在nums[mid]==target时,如果我们继续更新上界,那么搜索区间会一直向左缩小,直到找到了左边界停止。相反,如果一直更新下界,那么搜索区间会一直向右缩小,直到找到了右边界停止。此时以左闭右闭区间为例,找左边界时left会停在左边界位置,right会在左边界-1的位置;找右边界时,left停在右边界+1的位置而right=右边界。再考虑找不到的情况,实际上在上面已经分析过了,以左闭右闭区间为例,最终如果找不到目标元素,必定有三种情况,这三种情况都有left>right。

class Solution:
    def find_first(self, nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right - left) // 2 + left
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left

    def find_last(self, nums, target):
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right - left) // 2 + left
            if nums[mid] <= target:
                left = mid + 1
            else:
                right = mid - 1
        return right
    
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        first = self.find_first(nums, target)
        last = self.find_last(nums, target)

        # 检查找到的位置是否有效
        if first <= last:
            return [first, last]
        else:
            return [-1, -1]

27.移除元素

暴力解法:两层循环嵌套,第一层找数,第二层移动数组。说起来简单,实际操作还是有一些细节。首先在python中,range(n) 在循环开始之前就已经被评估并创建了,它生成了一个固定长度的迭代器。循环的次数由这个迭代器的长度决定,而这个长度是在循环开始时就已经确定的。因此第一层循环只能使用while循环代替。其次,在循环中,当if条件成立,开始移动数组时,当前index也需要向前移一位,否则遇到连续删除的情况会遗漏。暴力实现代码如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i,length = 0, len(nums)

        while i <= length - 1:
            if nums[i] == val:
                for j in range(i+1,length):
                    nums[j-1] = nums[j]
                length -= 1
                i-=1
            i+=1
        return length

双指针解法:使用快慢指针操作数组,快指针遍历数组并查找不等于val的值,慢指针就是新数组的index,一旦快指针遇到不等于val的值,就将其覆盖到当前慢指针的index上(实际上自己在做题的时候不是采用了”覆盖“而是采用了”互换“,计算量稍大了一些但总体还是O(n)的)。以下是双指针法实现代码:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        fast,slow,length = 0,0,len(nums)

        while fast < length:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        
        return slow

实际上本题可以打乱顺序,也就有了另一种更少移动元素的解法,具体是双指针分别从左右两端开始,左指针正常向右移动,一旦遇到等于val的情况,用右指针的值覆盖这个位置,右指针左移。代码如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        left,right = 0,len(nums)-1

        while(left <= right):
            if nums[left] == val:
                nums[left] = nums[right]
                right -= 1
            else:
                left += 1
        return left

拓展题26.移除有序数组中的重复元素-双指针,快指针遇到不等于现在慢指针的元素,慢指针右移并将其指向元素覆盖为快指针元素。代码如下:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) < 2: return len(nums)
        slow,fast = 0,1
        while fast < len(nums):
            if nums[slow] != nums[fast]:
                slow+=1
                nums[slow] = nums[fast]
            fast += 1
        return slow +1

拓展题283.移动零-双指针,快指针指到非零元素时交换快慢指针元素且慢指针右移。直到遍历整个数组。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        fast,slow = 0,0
        while fast < len(nums):
            if nums[fast] != 0:
                nums[slow], nums[fast] = nums[fast],nums[slow]
                slow+=1
            fast+=1

拓展题844.比较含退格的字符串,这里跳过进出栈还原字符串的算法。分别定义指针从两个字符串尾开始向前遍历,定义函数next_valid_char_index去跳过需要被回退的字符:如果指针指向‘#’则回退计数器+1,如果指针指向字母,查看回退计数器,大于零则跳过该字符并且计数器-1,等于零则返回当前index值;主函数循环开始则先调用回退函数,如果此时没有遍历完全,则比较两个字符,如果不等直接返回false,直到其中一个遍历完全,此时比较索引即可判断两个字符串是否相等。代码如下:

class Solution:
    def next_valid_char_index(self, s, i):
        backspace_count = 0
        while i >= 0:
            if s[i] == '#':
                backspace_count += 1
            elif backspace_count > 0:
                backspace_count -= 1
            else:
                break
            i -= 1
        return i
    def backspaceCompare(self, s: str, t: str) -> bool:
        i, j = len(s) - 1, len(t) - 1
        while i >= 0 or j >= 0:
            i = self.next_valid_char_index(s, i)
            j = self.next_valid_char_index(t, j)

            if i >= 0 and j >= 0 and s[i] != t[j]:
                return False

            i -= 1
            j -= 1

        return i == j

拓展题977. 有序数组的平方:左右指针,最大值一定出现在最左或者最右,每次比较左右数的平方大小,大的append进新数组,最终反向输出数组。代码如下:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left,right = 0, len(nums)-1
        res = []
        while left <= right:
            if nums[left] ** 2 >= nums[right] ** 2:
                res.append(nums[left]**2)
                left += 1
            else:
                res.append(nums[right]**2)
                right -= 1
        return res[::-1]

今日总结:

今天的内容其实不算多也不算难,贵在坚持吧,细节方面需要注意。

二分法尤其是边界条件的处理;双指针法中的快慢指针个人理解到慢指针划过区域为新数组,快指针遍历去寻找新数组元素,双指针完成了两层循环要做的事情。其实做完题感觉也不全是快慢指针,一些双指针题目似乎还挺有技巧性,多积累经验吧。

目前还是萌新状态,今日存疑——循环不变量,看了书还是没能理解(只能理解书上例子和代码随想录上的例子,告诉我这是循环不变量我可以能明白,但是遇到新问题问我如何设置循环不变量可能会有问题)。就感觉这个问题有点不会描述?感觉需要多积累经验回过头再看这个问题。

PICO640红外探测器配置模块verilog Ulis pico 640红外探测器配置模块 阅读详情

相关推荐

电驱系统功率级“多合一”解决方案

如何提升电驱动系统的产品性能、减小能耗和进一步轻量化,以加强整车市场竞争力,是摆在国内外新能源车企面前的共同课题。为此,具有多年动力总成电子系统开发经验的美国著名半导体及电子解决方案专家——德州仪器(Texas Instrument)提出了多种功率级别“多合一”整合方案和设计思路,助力新能源车企提升技术优势。

yessunday的专栏 1371

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

# 1 数组### 1.1 数组理论基础数组的特点:- **数组是存放在连续内存空间上的相同类型数据的集合**(**数组内存空间的地址是连续的**)- 带来的缺点:正是**因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。**- 数组可以方便的通过下标索引的方式获取到下标下对应的数据(**数组下标都是从0开始的**)- **数组的元素是不能删的,只能覆盖。**二维数组特点:- **C++中二维数组在地址空间上是连续的**

weixin_46221999的博客 1591

【雕爷学编程】MicroPython手册之 Teensy 4.1 实时时钟 (RTC)

在类的初始化函数中,定义了用于控制I2C总线的i2c对象和RTC模块的I2C地址。接着,使用该引脚初始化了一个Pin对象。它还提供了8个串口,3个SPI端口,3个I2C端口,2个I2S/TDM数字音频端口,3个CAN总线(其中一个支持CAN FD),以及一个SDIO(4位数据)原生SD卡端口12。2、内存:Teensy 4.1配备了1024 KB的RAM(其中512 KB是紧密耦合的),8 MB的Flash(其中64 KB用于恢复和EEPROM模拟),以及两个位置可以选择添加更多的QSPI内存芯片。

雕爷学编程 575

代码随想录算法训练营第一天|704.二分查找、27.移除元素

day1

qq_49364887的博客 1668

达梦数据库修改最大连接数

达梦数据库的最大连接数推荐配置与服务器内存有关。不应设置得过大,否则容易导致出现OOM。文件中整型的参数值。DSC环境下,除了特殊参数以外,其他参数值会在OK节点上同步。返回值:当前DM.INI文件中对应的参数值。功能说明:返回DM.INI文件中。:DM.INI文件中的参数名。

Sebastien23的博客 3332

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2202

代码随想录算法训练营第一天 704. 二分查找 27. 移除元素977.有序数组的平方

内容较为简单。有几个小问题。704. 二分查找注意左闭右闭和左闭右开两种写法,想清楚边界问题。27. 移除元素思路上有一个巧点,用双指针,而不是暴力。977.有序数组的平方思路上有一个巧妙的地方,首先,肯定不是暴力,有一些方法,比如双指针。其次,双指针其实有不同的用法,比如:(1)指向0左右的最靠近0的正负数,向两边移动。新创建的用来放结果的数组中,指针从后往前走。(2)从两边开始,到中间会和。新创建的用来放结果的数组中,指针从前往后走。

2301_80094768的博客 957

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2879

代码随想录算法训练营第一天|LeetCode704. 二分查找,LeetCode27. 移除元素,LeetCode977. 有序数组的平方

思路:在数组两头分别设一个指针,然后让target和nums[mid]相比较,如果小于,则将右指针的范围缩到mid的左边,也就是r=mid-1,并重新设一次mid;如果大于,同理。如果等于则返回当前mid的下标。如果在循环条件结束之前依然没有搜索到,则返回-1。

Liverpool0519的博客 1212

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6693

GameFramework 框架详解之 Network网络模块 工具链

GameFramework(下面简称GF)Demo中,已经给我们提供了Network模块使用的protobuf使用的动态链接库protobuf-net.dll,但是GF并没有给我们提供protobuf相关的工具链,比如:1.proto文件自动导出对应c#的Packet类和PacketHandler类2.导出Packet类继承IReference以便使用引用池。3.自动生成Packet类和PacketHandler的Id,且保持和服务器Id一一对应。

TxNet 2903

代码随想录算法训练营第一天 | 704. 二分查找、 27. 移除元素、977.有序数组的平方

704. 二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。最简单的思路就是用一个循环暴力查找。这是使用二分法的前提,本题用二分法也更省时间。二分法并不难,但要关注边界处理,即要定义我们所找的目标元素target是处在一个[left,right]闭区间,还是处在(left,right]或[left,right)这种区间之中。

m0_52651829的博客 864

智能测试策略优化:平衡覆盖率、时间和资源

在软件开发过程中,测试是确保软件质量的关键环节。然而,测试工作往往面临着诸多挑战,其中如何在保证测试覆盖率的前提下,合理分配时间和资源是一个核心问题。本文章的目的在于探讨智能测试策略的优化方法,帮助软件测试团队在有限的时间和资源条件下,实现尽可能高的测试覆盖率。文章的范围涵盖了智能测试策略的核心概念、算法原理、数学模型、实际应用案例以及相关工具和资源等方面。本文将按照以下结构进行组织:首先介绍智能测试策略优化的背景和相关概念,包括核心术语和缩略词的定义;

AIGC应用创新大全的博客 620

代码随想录算法训练营第一天|LeetCode704 二分查找、LeetCode27 移除元素、LeetCode977 有序数组的平方

有些代码写的有点重复目前只会使用最简单方法解题,尽可能考虑时间复杂度有时间了解一下排序算法今日两种双指针法都降低了时间复杂度,以后可以考虑使用场景(什么时候能使用双指针法)三道题目:循环区间不变量、快慢指针法、双指针法。

weixin_46078957的博客 579

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

代码随想录算法训练营第一天 | LeetCode704.二分查找、LeetCode27.移除元素、LeetCode977.有序数组的平方

LeetCode

zhuabazhuabahuo的博客 990

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

代码随想录算法训练营第一天 | 704.二分查找 27.移除元素 977.有序数组平方

704. 二分查找文章讲解:代码随想录视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili思路:设置left,right下标初始值,while区间循环,mid指向(left+right)/2;目标值target<nums[mid],目标值在mid左半部分,改变right将区间缩小到左半部分;目标值target>nums[mid],目标值在mid右边半部分,改变left将区间缩小到右半部分;目标值target=nums[mi

m0_50413530的博客 709

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

代码随想录算法训练营第一天,数组理论基础,704二分查找,27移除元素,977有序数组的平方

题目要求时间复杂度为O(logn),那么当然也是二分法要求返回开始位置和结束为止,那么只需在nums[mid]==target的条件中进行修改,记录当前的下标值。就找两次,一次下标最大值,一次下标最小值。

Joesphine7的博客 445

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方。

重新审视了一下代码发现可以换一种理解方式,假设初始状态时所有元素都不等于val,即k=nums.size(),每检测到一个nums[i] == val,将nums[i]与nums[k-1]交换位置,同时缩小k的范围,最终就得到了长度为k的数组,且能够实现k以外的值全为val。这样做的时间复杂度为O(n),空间复杂度为O(1)。注意到平方最大的值一定位于nums的最左端或者最右端,想到使用low与high分别指向最左边的值与最右边的值,将最大的值存入result中,循环选出每一轮的最大值,最终得到结果。

weixin_64181248的博客 412

代码随想录算法训练营第一天,704. 二分查找 , 27. 移除元素, 27. 移除元素

考虑边界条件要详细,常见的边界条件有,输入为空,输入为1,但是输入错误,返回值也是考虑边届问题的一部分。双指针进行夹闭,在多条件的情况下,可以对数组进行快速的查找,顺便进行排序,分类,移除等。977.有序数组的平方。

m0_71128641的博客 220

代码随想录算法训练营第一天|704. 二分查找、27. 移除元素

二分查找和移除元素的解题思路与答案

weixin_61344527的博客 2368

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977. 有序数组的平方

看完文章和视频后,明确了二分法的具体查找方案数组为有序数组,同时数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。明确区间和缩小范围:[left, right]—还是[left, right)

weixin_39877528的博客 434

代码随想录算法训练营第一天 704 二分查找、27 移除元素

本文介绍了两个算法问题的解决方案:704.二分查找和27.移除元素。对于704.二分查找,提供了两种解决思路,一种是暴力遍历,时间复杂度为O(n),另一种是二分查找,时间复杂度为O(log n)。对于27.移除元素,也提供了两种解决思路,一种是暴力解法,时间复杂度为O(n^2),另一种是双指针法,时间复杂度为O(n)。

weixin_42797677的博客 1202

代码随想录算法训练营第一天数组理论基础、704. 二分查找、27. 移除元素、977.有序数组的平方

挑战一下算法学习,算法题目的讲解文章资料等来自代码随想录https://programmercarl.com/,本文主要分享python版本的随想录答案和自己的一些思考

weixin_47987373的博客 363
下一篇: 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II
LIEBESFREUD
博客等级 码龄9年 372粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值