Dayx4:剑指offer

2024-06-23 23:38
文章标签 dayx4 offer

本文主要是介绍Dayx4:剑指offer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

∙ \bullet 举一反三之二分法

53.1 (多practice). 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

在这里插入图片描述

def searchRange(self, nums, target):if not nums: return -1,-1l,r=0,len(nums)-1#二分找到target的第一个位置while l<r:mid=l+(r-l)//2if nums[mid]<target:  # 说明答案在右边,不包含midl=mid+1else:r=midif nums[l]!=target: return -1,-1![在这里插入图片描述](https://img-blog.csdnimg.cn/20200718165738578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTQ5MDA=,size_16,color_FFFFFF,t_70)left=l# 二分找到target的最后一个位置l, r = 0, len(nums) - 1while l < r:mid=l+(r-l+1)//2if nums[mid]<=target:  # 说明答案在右边,包含mid,故上面加1l=midelse:r=mid-1return left,r

53.2. 缺失数字 leetcode 268
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。

Time: O(logn)
#[数组有序]二分
def getMissingNumber(self, nums):nums.sort()  #!!!leetcode中无序,故先sortif not nums: return 0'''standard 二分'''l,r=0,len(nums)-1while l<r:mid=l+r>>1  #等价(l+r)//2if nums[mid]!=mid:  #满足条件的,保持不动r=midr=midelse:l=mid+1if nums[l]==l: return l+=1return l

∙ \bullet 由于异或运算(XOR)满足结合律,
并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。在这里插入图片描述

#[数组无序]
公式求和   Time: O(n)
def getMissingNumber_2(self, nums):n=len(nums)res= (0+n-1)*n/2 - sum(nums)return res异或法
def missingNumber(self, nums: List[int]) -> int:miss = len(nums)  # 假设缺失值为 nfor i, num in enumerate(nums):miss ^= i ^ numreturn miss

∙ \bullet 知识点:
&、 |位运算符; and、or逻辑运算符
`Python 中 (&,|)和(and,or)之间的区别

`python集合中&、|、-、^、与and、or

53.3. 数组中数值与下标相等的元素
实现一个函数找出单调递增的数组中任意一个数值等于其下标的元素。
e.g,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等

def getNumberSameAsIndex(self, nums):l,r=0,len(nums)-1while l<r:mid=l+r>>1if nums[mid]<mid:l=mid+1else:r=mid  #!满足条件,就不动if nums[l]!=l: return -1       return l

∙ \bullet 二叉树系列—树遍历algs application

  1. 二叉搜索树的第k小的节点
    一棵二叉搜索树,请找出其中的第k小的结点。
    假设树和k都存在,并且1≤k≤树的总结点数。

中序遍历
二叉搜索树:all左节点值<根节点值 all右节点值>根节点值

中序遍历的同时,没遍历一次,k–,当k = 0时,ans

class Solution(object):def kthNode(self, pRoot, k):'''中序遍历''' #[自顶向下]剖开;[自下向上]寻找def dfs(pRoot):  #!!!noneed selfif not pRoot: returndfs(pRoot.left)self.k -=1if self.k==0: self.res=pRootif self.k>0: dfs(pRoot.right)  #剪枝;只self.k-=1self.k=k #!!! k要为全局变量self.res=Nonedfs(pRoot)return self.res

55.1. 二叉树的深度 简单
给定一个二叉树,找出其最大深度。

在这里插入图片描述

递归
class Solution:def maxDepth(self, root: TreeNode) -> int:if not root: return 0left  = self.maxDepth(root.left)right = self.maxDepth(root.right)return max(left,right)+1

55.2. 平衡二叉树 leetcode 110
判断它是否是高度平衡的二叉树?

definition: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

class Solution:def isBalanced(self, root: TreeNode) -> bool:def dfs(root):if not root: return 0left =dfs(root.left)  #!!!调用[嵌套在上一个self def函数下;同T54;区别T55.1]!!!right=dfs(root.right)if abs(left-right)>1: self.ans =Falsereturn max(left, right)+1self.ans=Truedfs(root)return self.ans

这篇关于Dayx4:剑指offer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088607

相关文章

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

剑指offer(C++)--扑克牌顺子

题目 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为1

剑指offer(C++)--翻转单词顺序列

题目 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class S

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

剑指offer(C++)--和为S的两个数字

题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 class Solution {public:vector<int> FindNumbersWithSum(vector<int> array,int sum) {vector<int> result;int len = array.size();if(

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

剑指offer(C++)--第一个只出现一次的字符

题目 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). class Solution {public:int FirstNotRepeatingChar(string str) {map<char, int> mp;for(int i = 0; i < str.size(); ++i)m