算法(18)-leetcode-剑指offer2

leetcode-剑指offer-2

  • 11.面试题13-机器人的运动范围-广度优先搜索
  • 12.面试题14-1-剪绳子
  • 13.面试题14-2-剪绳子2
  • 14.面试题16-二进制中1的个数-布莱恩·克尼根
  • 15.面试题16-数值的整数次方-快速幂解析法
  • 16.面试题17-打印从1到最大的n位数
  • 17.面试题18-删除链表的节点
  • 18.面试题19-正则匹配-回溯
  • 19.面试题20-表示数值的字符串
  • 20.面试题21-调整数组的顺序使得奇数位于偶数的前面-双指针

本系列博文为题库刷题笔记,(仅在督促自己刷题)如有不详之处,请参考leetcode官网:https://leetcode-cn.com/problemset/lcof/

编程语言为python

11.面试题13-机器人的运动范围-广度优先搜索

地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1].一个机器人从坐标[0,0]开始移动,它每一次可以向左右上下移动一格,机器人不能进入行列坐标位数之和大于k的格子(k=18,机器人能够进入方格[35,37],因为3+5+3+7=18)。请问机器人能够达到多少个格子。–需要从左上角开始的连续的区域。当一个方向不可以走时,设置一个flag,如果当flag==3时,停止向下遍历。

广度优先搜索:将不能走的格子堪称障碍物,这是一道搜索题,可以使用深度优先或广度优先来解决。本题隐含条件要求从左上角到右下角的联通集。(k=1,[10,0]是满足可走条件,但是机器人首先到不了[9,0].)广度优先遍历先将(0,0)放入队列,判读是否可达,可达就将它右边和下边的格子(下一步备选可达点)坐标[0,1] 和[1,0]放入到队列中,不断判断队列备选可达的点是否可达。直至队列为空。(如果一个点不可达,他的右边下边就不能从这个点出发达到,但可能可以从其他点出发得到)

class Solution(object):def movingCount(self, m, n, k):""":type m: int:type n: int:type k: int:rtype: int"""def is_available(i,j):sum_ij=0# 取出一个数字每位上的数while(i>0):mod=i%10sum_ij+=modi=(i-mod)/10while(j):mod=j%10sum_ij+=modj=(j-mod)/10if sum_ij<=k:return Trueelse:return Falseres=0que=[(0,0)]visted_dit={}while(que):i,j=que.pop(0)if 0<=i<m and 0<=j<n and is_available(i,j):if not visted_dit.get((i,j)): # 一些已经走过的点需要标记,避免重复遍历visted_dit[(i,j)]=Trueres+=1que.append((i+1,j))que.append((i,j+1))   return res

12.面试题14-1-剪绳子

给你一根长度为n的绳子,请把绳子坚称整数长度的m段(n,m都是整数),每段绳子的长度记为k[0],k[1],…,k[m-1]。请问k[0]k[1]…k[m-1]可能的最大乘积是多少。(2 <= n <= 58)
完全背包问题:绳子的长度是背包容量,每次剪掉一段,让乘积最大嘛。
dp[i]表示长为i的绳子至少切了一次的最大乘积,则dp[i]的更新表达式为:dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))
dp[j]与j的区别:dp[j]至少剪过一次,j表示一次没剪。

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp=[0]*(n+1)dp[1]=1for i in range(2,n+1): for j in range(1,i):# print("i:",i,"j:",j,"i-j:",i-j,"dp[j]:",dp[j],dp[j]*(i-j),j*(i-j))dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))print dpreturn dp[-1]

13.面试题14-2-剪绳子2

本题与上一题题目一致只是输入数据n的范围变大了,可能回造成大数越界的问题。之前的dp可能回造成超时或出错。
(2 <= n <= 1000)
和上一题写的一毛一样,勉强过了,击败24.73%用户。

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp=[0]*(n+1)dp[1]=1for i in range(2,n+1): for j in range(1,i):# print("i:",i,"j:",j,"i-j:",i-j,"dp[j]:",dp[j],dp[j]*(i-j),j*(i-j))dp[i]=max(dp[i],dp[j]*(i-j),j*(i-j))return dp[-1]%(10**9+7)

基于数学推到的方案
算术几何均值不等式:
n1+n2+...+naa>=n1n2...naa\frac{n_1+n_2+...+n_a}{a}>=\sqrt[a]{n_1n_2...n_a}an1+n2+...+na>=an1n2...na
a个数字的算术平均值,大于等于,这a个数的几何平均值。
a=2时:
n1+n22>=n1n22\frac{n_1+n_2}{2}>=\sqrt[2]{n_1n_2}2n1+n2>=2n1n2
右边取得最大值的当且仅当n1=n2=,...,nan_1=n_2=,...,n_an1=n2=,...,na
即可得到推论1:将绳子 以相等的长度 等分多段,得到的乘积最大。

将绳子按照长度x分成a段,n=axn=axn=ax,乘积最大为xax^axa(x和a都是变量).因为a=nxa=\frac{n}{x}a=xn,即最大值为:
xa=xnx=[x1x]nx^a=x^{\frac{n}{x}}=[x^{\frac{1}{x}}]^nxa=xxn=[xx1]n
问题转换为求上式子的最大值,对上式求导让其为0,求得极大值点为e。因为切分长度必须为整数,比较x=2,x=3的大小。x=3时x1xx^{\frac{1}{x}}xx1更大。
所以推论2为:将绳子尽量分为长度为3的多个等分段时,乘积最大。

综上:
推论1说的是需要将绳子绳子分为k段,这k段的长度是等分时这个k段的乘积最大。
推论2说的是每段的长度最好是3,对应的等分方式乘积最大。

n的取整依据能不能被3整除,可以分为(n=3a+bn=3a+bn=3a+b)-确定的方法有贪心选择的性质:
b=0:最大乘积3a3^a3a
b=1:前面切出的a段3中拿出一段来,和1凑成长度为4子段,切成22=4>13
b=2:最大值为3a∗23^a*23a2

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n<=3:return n-1       # 初始条件n=2 res=1; n=3,res = 2a,b=n//3,n%3res=0if b==0:res=3**aelif b==1:res=3**(a-1)*4else:res=3**(a)*2return res%(10**9+7)

14.面试题16-二进制中1的个数-布莱恩·克尼根

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
(461.汉明距离:两个数字二进制表示形式的对应位置不同的数目。–将两个数据取异或,然后统计异或结果的个数)

布莱恩·克尼根算法:利用特定的比特位和算术运算符移除最右边的1。
在这里插入图片描述

class Solution(object):def hammingWeight(self, n):""":type n: int:rtype: int"""res=0while(n):res+=1n=n &(n-1)return res

15.面试题16-数值的整数次方-快速幂解析法

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

class Solution(object):def myPow(self, x, n):""":type x: float:type n: int:rtype: float"""res=1if  n<0:flag=-1n*=-1else:flag=1for i in range(n):res*=xreturn res if flag==1 else 1/res

291.304 最后执行输入:0.00001,2147483647 ,报错memotyError

参考思路:
快速幂解析法(二进制):略
快速幂解析法(二分):xnx^nxn可以转换为以下两种情况:
xn=(x2)n//2x^n=(x^2)^{n//2}xn=(x2)n//2 ,n为偶数
xn=x(x2)n//2x^n=x(x^2)^{n//2}xn=x(x2)n//2,n为奇数
可以通过以上操作,将幂从n降到n//2,不断重复,直至幂将为0.
在这里插入图片描述

class Solution(object):def myPow(self, x, n):""":type x: float:type n: int:rtype: float"""if x==0:return 0if n<0:x,n=1/x,-nres=1while(n):if n%2==1:    # n&1res*=xx*=xn=n//2   # n>>=1return res

16.面试题17-打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

也不是很明白考察的什么!!!

class Solution(object):def printNumbers(self, n):""":type n: int:rtype: List[int]"""l=10**nres=[]for i in range(1,l):res.append(i)return res

17.面试题18-删除链表的节点

给定单向链表的头指针和一个要删除的节点的,定义一个函数删除该节点。返回删除后的链表的头节点。
说明:题目保证链表中节点的值互不相同

删除链表节点注意dummy节点技巧,避免需要删除的节点是头节点。

class Solution(object):def deleteNode(self, head, val):""":type head: ListNode:type val: int:rtype: ListNode"""dummy=ListNode(0)dummy.next=headpre_node=dummycurr_node =headwhile(curr_node):next_node=curr_node.nextif curr_node.val==val:pre_node.next=next_nodereturn dummy.nextpre_node=curr_nodecurr_node=next_nodereturn dummy.next

18.面试题19-正则匹配-回溯

请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

回溯方法:如果没有星号,问题就会很简单–只需要从左往右检查匹配串s是否能够匹配模式串p中的每一字符。
当模式串中有星号时,我们需要检查匹配串s中的不同后缀,判断它们是否能匹配模式串中的剩余部分,回溯方法可以用来解决这一类问题。当模式串中的星号出现在pattern[1]的位置时,可以将问题更新为(1)s与pattern[2:]的匹配问题(2)s[1:]与pattern的匹配问题(s[0]与pattern[0]匹配,pattern[1]的星号可以复制patern前面的字符。)

class Solution(object):def isMatch(self, s, p):""":type s: str:type p: str:rtype: bool"""if not p:return not sfirst_match=bool(s) and  p[0] in {s[0],"."}if len(p)>=2 and p[1]=="*":return (self.isMatch(s,p[2:])) or (first_match and self.isMatch(s[1:],p))else:return first_match and self.isMatch(s[1:],p[1:])

19.面试题20-表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
leetcode 65

参考思路:有限状态机器DFA
有限状态机可以先写正则表达式,然后转换成DFA/直接写,大概率不是最简的。
有限状态机:对于每个状态接收下一个字符,DFA能够确定一条唯一的转换路径,简单的表驱动的一些方法就能实现,只需要读一遍输入流。
真不会写!!!

20.面试题21-调整数组的顺序使得奇数位于偶数的前面-双指针

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
暴力法:时间超出限制:15/17

class Solution(object):def exchange(self, nums):""":type nums: List[int]:rtype: List[int]"""n=len(nums)flag=ni=0while(i<flag):if nums[i]%2==0:    for j in range(i,flag-1):nums[j],nums[j+1]=nums[j+1],nums[j]# print(i,j,j+1,nums)flag-=1 # 用于控制已经操作过的偶数,换完可能还是偶数else:i+=1return nums

不要逐个换,直接用右指针指向结尾

class Solution(object):def exchange(self, nums):""":type nums: List[int]:rtype: List[int]"""n=len(nums)flag=n-1i=0while(i<flag):if nums[i]%2==0:    nums[i],nums[flag]=nums[flag],nums[i]flag-=1 # 用于控制已经操作过的偶数,换完可能还是偶数else:i+=1return nums

注意点:换过之后的索引是不增加的。

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

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

相关文章

rabbitmq技术的一些感悟(一)

Rabbitmq 初识rabbitmq RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍 几个概念说明: Broker

leetcode21 合并两个链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 思路&#xff1a;链表归并。 /*** Definition for si…

rabbitmq技术的一些感悟(二)

上一节文章主要是说了一下rabbitmq的安装以及搭建好环境的一些命令,以及常用的api调用,其实自从google被封掉之后,我之前收藏的很多技术连接都已经被禁止访问了,这个是多么可悲的一件事情啊,说多了都是泪。 首先,我先写一段消费者的模块,建立连接,初始化amq以及销毁连接…

算法(19)-leetcode-剑指offer3

leetcode-剑指offer-321.面试题22-链表中的倒数第k个节点22.面试题24-反转链表23.面试题25-合并两个排序链表-递归24.面试题26-树的子结构25.面试题27-二叉树的镜像26.面试题28-对称二叉树27.面试题29-顺时针打印矩阵28.面试题30-包含min函数的栈29.面试题31-栈的押入&#xff…

高效解析xml的总结,闲下来写的

需要这么几个库&#xff0c;直接放在你的代码工程里即可&#xff1a; #include "rapidxml.h" #include "rapidxml_utils.h" int ReBornBossConf::loadConf(const char* szFileName){ rapidxml::file<char> fdoc(szFileName); rapidxml::xml_docum…

leetcode35 插入的位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 思路&#xff1a;二分查找 public class Solution {public int searchInsert(i…

算法(20)-leetcode-剑指offer4

leetcode-剑指offer-433.面试题33-二叉搜索树的后序遍历序列34.面试题34-二叉树中和为某一值的路径35.面试题35-复杂链表的复制36.面试题36-二叉搜索树与双向链表37.面试题37-序列化二叉树38.面试题38-字符串的排列39.面试题39-数组中出现次数超过一半的数字40.面试题40-最小的…

关于linux的进程中的各个线程cpu占用情况的分析和查看

我们经常会在新开的服搭建一个游戏的服务器,有时候要进行压力测试,那么如何来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们也许会通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析多组数据就可以…

算法(21)-leetcode-剑指offer5

leetcode-剑指offer-443.面试题43-1&#xff5e;n整数中1出现的次数44.面试题44-数字序列中某一位的数字45.面试题45-把数组排成最小的数-快排变种46.面试题46-把数字翻译成字符串47.面试题47-礼物的最大价值-dp48.面试题48-最长不含重复字符的子字符串-滑动窗口法49.面试题49-…

游戏中DDA算法和Bresenham算法的应用

在角色扮演或即时战略游戏中,经常会将角色以最佳的方式走到指定地点。游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举法,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明是一种不适合网络游戏寻路方法。而启发式搜索算法在障碍较少的情况下…

leetcode7 整数反转

给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数&#xff0c;则其数值范围为 [−231, …

关于苹果purchase的验证

用户在购买苹果的商品的过程如下:

算法(23)-leetcode-剑指offer7

leetcode-剑指offer-559.面试题59-队列的最大值60.面试题64-求12...n61.面试题65-不用加减乘除做加法62.面试题66-构建乘积数组63.面试题68-1二叉树搜索树的最近公共祖先64.面试题68-2二叉树的最近公共祖先65.面试题67-把字符串转换成数字-自动机66.面试题20-表示数值的字符串-…

C/C++ 获得公网ip地址和内网ip

获得公网ip:bool getPublicIp(string& ip) {int sock;char **pptr = NULL;struct sockaddr_in destAddr;struct hostent *ptr = NULL;char destIP[128];sock = socket(AF_INET,SOCK_STREAM,0);if( -1 == sock ){perror("creat socket failed");return …

终于,我读懂了所有Java集合——List篇

ArrayList 基于数组实现&#xff0c;无容量的限制。 在执行插入元素时可能要扩容&#xff0c;在删除元素时并不会减小数组的容量&#xff0c;在查找元素时要遍历数组&#xff0c;对于非null的元素采取equals的方式寻找。 是非线程安全的。 注意点&#xff1a; &#xff08…

关于长连接和短连接

短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

C++(8)--数组array-长度固定

数组及常用算法1.数组基本概念2.一维数组2.1数组的定义2.2数组初始化2.3一维数组动态赋初值2.4一维数组应用实例2.5一维数组的排序算法2.6 一维数组元素的删除和插入array3.二维数组3.1数组定义3.2二维数组的动态赋值《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》…

关于去苹果服务器验证充值的一些看法

前端时间看了下关于app充值验证发送游戏金币的好多帖子和文章,也总结了一下app校验的php代码:可以参考我的上一封博客: http://blog.csdn.net/pbymw8iwm/article/details/42167125 其中这个帖子回复的大神比较多:点击打开链接 有些人认为拿苹果的receptdata去验证,通过返…

终于,我读懂了所有Java集合——queue篇

Stack 基于Vector实现&#xff0c;支持LIFO。 类声明 public class Stack<E> extends Vector<E> {} push public E push(E item) {addElement(item);return item; } pop public synchronized E pop() {E obj;int len size();obj peek();removeElementAt(…

IAP-应用内购买流程

成为ios开发者最大的好处就是&#xff0c;你编写的应用程序会有很多方式可以赚钱。比如&#xff0c;收费版&#xff0c;免费挂广告版&#xff0c;还有就是程序内置购买。 程序内置购买会让你爱不释手&#xff0c;主要有以下原因&#xff1a; 除了程序本身的下载收费以外&#x…