剑指offer:20、数组中的逆序对;21、连续子数组的最大和;22、整数中1出现的次数

剑指offer题目及答案 剑指offer最近在牛客网上刷剑指offer的题目,现将题目和答案总结如下 阅读详情

20、数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000
示例1
输入
1,2,3,4,5,6,7,0
输出
7
笔记:题目很简单,然而按照写出来的,不能通过会超时,找了博客,看到的思路
更加简洁(牛逼)的方法:
先将原序列排序,然后从排完序的数组中取出最小的,它在原数组中的位置表示有多少比它大的数在它前面,每取出一个在原数组中删除该元素,保证后面取出的元素在原数组中是最小的,这样其位置才能表示有多少比它大的数在它前面,即逆序对数。

class Solution:
    def InversePairs(self, data):
        # write code here
        if len(data) == 0 or len(data) == 1:
            return 0
        num = []
        for i in data:
            num.append(i)
        num.sort()
        c = 0
        for i in range(len(num)):
            p = data.index(num[i])
            c += p
            data.remove(num[i])  #deta.pop(p)
        return c%1000000007

附上冒泡排序和快速排序python实现

#冒泡排序-------------------------------------------------------
def BubbleSort(list):
    for i in reversed(range(len(a))):
        for j in range(0,len(a)-1):
            if(list[j] > list[j+1]):
                temp=list[j]
                list[j]=list[j+1]
                list[j+1]=temp
def qsort(list):
    if list==[]:
        return []
    else:
        smaller=[x for x in list[1:] if x<list[0]] #比list[0]小的部分
        bigger=[x for x in list[1:] if x>=list[0]] #比list[0]大(或相等)的部分
        return qsort(smaller)+[list[0]]+qsort(bigger)

21、连续子数组的最大和
题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

解法1:自己的解法,总算可以做出一类题型了

# -*- coding:utf-8 -*-
class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        num = []
        for i in array:
            num.append(i)
        if len(num) == 1:
            return num[0]
        r = []
        for i in range(len(num) - 1):
            a = num[i]
            for j in range(i + 1, len(num)):
                a = a + num[j]
                r.append(a)
        r = r + num
        r.sort()
        return r[-1]

解法2:动态规划解法,得补一下知识,膜拜大神加油不要放弃你可以的
链接:https://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484
来源:牛客网

使用动态规划
F(i):以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变
F(i)=max(F(i-1)+array[i] , array[i])
res:所有子数组的和的最大值
res=max(res,F(i))

class Solution:
    def FindGreatestSumOfSubArray(self, array):
        # write code here
        res = max(array)
        temp = 0
        for i in array:
            temp = max(i, temp + i)
            res = max(res ,temp)
        return res

22、整数中1出现的次数
题目描述
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)

笔记:解法1,自己想的,改了一次竟然真的可以通过,还好测试用例比较简单~~算了一种奇怪的解法吧
解法1:自己的不简洁版本

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        num = []
        for i in range(1, n + 1):
            num.append(i)
        c = 0
        for j in range(n):
            a = str(num[j])
            c = c + a.count('1')
        return c

解法2:
1位数,1-9中,1一共出现了1次;

  2位数,10-99中,10-19的十位上一共出现了10*1=10次,对于每个十位开头的数字10-19、20-29,每个数个位上出现的是1-9中1出现的次数,共有9个区间9*1=9次;

  3位数,100-999,100-199百位上出现了10**2=100次,对于每个百位数开头,例如100-199,200-299,低位上其实就是0-99这个区间上1出现的次数,一共9个区间 9*19=171次;

  由此推测,对于1-9,10-99,100-999,每个n位数中包含1的个数公式为:

  f(1) = 1

  f(2) = 9 * f(1) + 10 ** 1

  f(3) = 9 * f(2) + 10 ** 2

  f(n) = 9 * f(n-1) + 10 ** (n-1)

  通过以上分析,我们可以确定对于任意一个给定的数,例如23456这个5位数,10000之前的数中包含的个数是确定的了,为f(1)+f(2)+f(3)+f(4),这是一个递归的过程
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        res=0
        tmp=n
        base=1
        while tmp:
            last=tmp%10
            tmp=tmp/10
            res+=tmp*base
            if last==1:
                res+=n%base+1
            elif last>1:
                res+=base
            base*=10
        return res
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        count=0
        i=1
        while i<=n:
            a=n/i
            b=n%i
            count+=(a+8)/10*i+(a%10==1)*(b+1)
            i*=10
        return count
剑指Offer(leetcode版) 目录剑指Offer-03 数组中重复的数字剑指Offer-04 二维数组中的查找剑指Offer-05 替换空格剑指Offer-06 从尾到头打印链表剑指Offer-07 重建二叉树剑指Offer-09 用两个栈实现队列剑指Offer-10-I 斐波那契数列剑指Offer-10-II 青蛙跳台阶问题剑指Offer-11 旋转数组的最小数字剑指Offer-12 矩阵中的路径剑指Offer-13 机器人的运动范围剑指Offer-14-I 剪绳子剑指Offer-14-II 剪绳子II剑指Offer-15 二进制中1 阅读详情

相关推荐

Python版剑指Offer题解

Python版剑指Offer题解 本题解配合leetcode中剑指Offer刷题使用 参考链接:图解算法数据结构 文章目录剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offe

小雷和他的朋友们 2012

逆序对的归并求解

逆序对的归并求解什么是逆序对?如何求逆序对呢?方法一:暴力法方法二:归并算法归并排序算法归并算法求解逆序对问题分析问题解决代码实例扩展内容总结 什么是逆序对? 数组中任意两个元素,凡是满足左边数字大于右边的,就构成一个逆序对。例如【5,9,3,6,8,10,1,4】 (10,1)就构成一个逆序对。 本文将介绍使用归并算法来求解逆序对的相关问题。 如何求逆序对呢? 方法一:暴力法 最先想到的就是暴力法,双重for循环判断即可,这种方式就不在介绍了。 方法二:归并算法 求之前,我们先理解一下归并排序算法。一定要

Renren151的博客 1467

《剑指offer》Java版

一、引言 《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。 二、目录 1赋值运算函数 2单例设计模式 3二维数组中查找目标值 4替换字符串中的空格 5从尾到头打印链表 6由前序和中序遍历重建二叉树 7用两...

thatkrisyang 2060

hdoj5273最大逆序对

#include using namespace std; int a[1005]; int dp[1005][1005];//以第i数为最大数从i到j的之间的逆序数对 int c[1005][1005];//计算所有和 int N; void init() { for (int i=0;i { for (int j=i+1;j { dp[i][j] =

hhy518518的专栏 982

剑指offer所有编程练习总结分析

给出剑指offer所有题目描述和对应的解题思路,并且在最有给出对应的代码展示和测试内容 由于牛客剑指Offer题目经过整理和筛选,是面试备考的经典资源之一,因此它的重要性在面试准备过程中是很高的。做这些题目可以帮助面试者熟悉常见的面试题型、巩固基础知识、提升编程能力,为应对面试提供了很好的准备。然而,还需注意不仅仅局限于做题,理解背后的原理和思想同样重要,以便能够在面试时灵活运用和展示自己的能力。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

Neo4j 智能供应链应用源代码简析

本文简析Neo4j智能供应链应用的源代码,让你也可以快速开发自己的供应链应用。

Neo4j 开发者博客 1680

面试题51 数组中的逆序对 分治算法 归并排序

题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 思路1 暴力求解 对数组中的每一个数Xi,它的后面有ni个比它小的数,则有多少个以数Xi开头的逆序对。 所以,总对数为: 其中N为数组长度。 得到如下代码: class Solution: def reversePairs(sel

NLOS的博客 401

【OpenArm|Control】openarm机械臂ROS2仿真控制

openarm_ros2 存储库包含用于 ros2_control 的包集合。 它抽象化了硬件控制,将手臂公开为接收位置、速度和扭矩命令并输出关节状态的接口。 openarm_bringup 包提供了通过包与 ROS2 控制框架集成的启动文件。该软件包提供启动文件和配置,用于启动硬件接口、加载控制器以及将物理臂连接到 ROS2 生态系统。启动后,您可以使用标准 ROS2 控制工具和接口来命令手臂并接收反馈。openarm_bringup bringup 包支持模拟硬件(用于模拟/测试)和通过硬件插件的真实

ai领域探索者,欢迎一起交流,目前从事具身智能行业。 2958

计算数组逆序对

问题:给定一个非空数组A,A存有n个整数。定义:若i<j 但 A[i]>A[j], 则称(i,j)为A的一个逆序对(inversation)。设计一个O(nlogn)算法求A中逆序对个数。 题目:来自 leetcode,https://leetcode.com/problems/count-of-smaller-numbers-after-self/ 显然最坏情况下逆序对有 n(n-...

Vanwoods的博客 773

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

MCU 微控制器,在实际项目中如何选型(以 STM32为例)

1.MCU 选型需要考虑的一些因素 2.案例:传感器设备的 MCU 选型

创享 AIOT 的专栏 1万+

经典算法——数组中的逆序对

一、题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 二、解题方法 利用归并排序的思想,先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。注意在合并两个已排序的子数组后,要更新数组。 class

henryzhihua 1万+

跟着Synopsys报告,一步步拆解车规芯片FMEDA计算(含公式与避坑点)

本文详细解析了车规芯片FMEDA计算的全流程,基于Synopsys报告拆解实战指南,涵盖基础失效率建模、安全机制效能评估及安全指标合成等关键步骤。通过公式解析、数据准备清单和避坑点分享,帮助工程师掌握ISO26262标准下的硬件量化分析技术,提升车载系统设计可靠性。

weixin_30460489的博客 195

[剑指offer] JAVA版题解(完整版)

本文首发于我的个人博客:尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二...

尾尾部落 6万+

告别U盘!在Ubuntu 22.04上从零搭建PXE网络装机服务器(支持UEFI/Legacy双启动)

本文详细介绍了在Ubuntu 22.04上搭建PXE网络装机服务器的完整流程,支持UEFI/Legacy双启动模式。通过配置DHCP、TFTP和HTTP服务,实现无需U盘的高效批量系统部署,解决传统安装方式的介质依赖、版本控制和时间成本问题,显著提升机房维护和设备部署效率。

weixin_42569329的博客 249

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

《剑指offer》66道算法题合集(java实现)

1

weixin_43774841的博客 2万+

YOLO11多类别数据集的类别平衡方法:讲解类别不平衡问题的识别方法,以及过采样、欠采样、类别权重调整等解决方案(一)

类别不平衡问题是机器学习和计算机视觉领域中一个常见但棘手的挑战。简单来说,当数据集中不同类别的样本数量存在显著差异时,我们就称这个数据集存在类别不平衡问题。在YOLO目标检测任务中,这意味着某些类别的目标对象在训练数据中出现得非常频繁,而其他类别的目标对象则很少出现。 想象一下,你正在训练一个交通监控系统,需要检测不同类型的车辆。在这个场景中,"汽车"这个类别可能有成千上万个实例,而"自行车"或"摩托车"可能只有几百个实例。这种数量上的巨大差异就是典型的类别不平衡问题。 从数学角度来看,假设我们有一个包

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 939

【刷题】2021最新剑指Offer汇总

新手村 关卡1-1 洛谷的第一个任务 超级玛丽游戏(洛谷-P1000):点击这里 A+B Problem(洛谷-P1001):点击这里

瑞新の博客:bennyrhys 6299

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大神整理的剑指Offer【所有面试题汇总】

    剑指Offer学习   剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载【https://github.com/Wang-Jun-Chao/coding-interviews】 目录 第01-10题 【剑指Offer学习】【面试题02:...

晓飛的博客 3万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《剑指Offer》解题目录(更新完毕)

题目来源于LeetCode上的《剑指Offer》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《程序员面试金典》可点击链接查看。

Michael是个半路程序员 6160

【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)

SQL 大部分是付费题目,可以看我的做题记录,目前做了一半(50题),另一半我觉得做出来对我个人的提升较小了,所以暂时没有做。 leetcode175. 组合两个表(SQL) leetcode176. 第二高的薪水 leetcode 178. 分数排名(SQL) leetcode180. 连续出现的数字(SQL) leetcode181. 超过经理收入的员工(SQL) leetcod...

少说,多做。 3万+

《剑指Offer》题解汇总索引表(leetcode)

《剑指Offer》题解汇总索引表(leetcode) ???? 文章目录《剑指Offer》题解汇总索引表(leetcode)[【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题](https://blog.youkuaiyun.com/weixin_44368437/article/details/114194973)[【LeetCode】《剑指Offer》第Ⅱ篇⊰⊰⊰ 12 - 19题](https://blog.youkuaiyun.com/weixin_44368437/article/details/114

像写诗一样优雅地写代码~ 2万+

剑指Offer(java答案)

剑指Offer(java答案)剑指Offerjava答案 5从尾到头打印链表 6重建二叉树 33把数组排成最小的数 34丑数 35第一个只出现一次的字符 36数组中的逆序对 37两个链表的第一个公共交点 38数字在排序数组中出现的次数 39二叉树的深度 扩展题判断二叉树平衡 40-数组只指出现一次的数字 异或去重 11-1000放在含有1001个元素的数组中只有唯一的一个元素值重复其它均只出现一次每

壮少Bryant的博客 2万+

剑指offer刷题顺序

数组(共12道题目): 【剑指Offer】1、二维数组中的查找 【剑指Offer】6、旋转数组的最小数字 【剑指Offer】13、调整数组顺序使奇数位于偶数前面 【剑指Offer】19、顺时针打印矩阵 【剑指Offer】28、数组中出现次数超过一半的数字 【剑指Offer】30、连续子数组的最大和 【剑指Offer】32、把数组排成最小的数 【剑指Offer】35、数组中的逆序对 【剑指Offer】37、数字在排序数组中出现的次数 【剑指Offer】40、数组中只出现过一次的数字 【剑

sunjingze1的博客 2434
上一篇: 剑指offer:15、二叉搜索树与双向列表;16、字符串的排列;17、数组中出现次数超过一半的数字(划重点:旷视现场面试编程题)
下一篇: 单链表的翻转python
Sulayman600
博客等级 码龄10年 13粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值