如何解hard算法题?

news2024/11/14 4:20:30

如何解困难题?

  • 前言
  • 一、案例
  • 二、困难题拆解
    • 1、自己的思路
    • 2、官方的思路
    • 3、源码
      • Java
      • golang
  • 总结
  • 参考文献

前言

上一篇文章写bitCount源码解析,对困难题有一些抽象的理解。
困难题就是一个个简单的知识点组成,加上其内在的逻辑联系。所以一个困难题,应该是先观其规律,再进行逻辑转换问题,再拆解小问题,用积累的知识点解决。
当然,如果没有积累到/思考角度不对,就看题解,多调研,别浪费时间!

一、案例

在这里插入图片描述

二、困难题拆解

1、自己的思路

	// target:从两个数组选出两组数据,合并倒序,就得到一个最大组合值。
    // 转换成有规律的问题。
    // 问题
    // 两数组肯定尽量单调(最大的那个单调),但是取出的单调栈合并长度并不一定为k
    // 如果两者合并长度大于等于k,倒排之后(依次选择),取前k个即可。
    // 如果不够k怎么办?

很明显,我的角度错了,但也有可取之处,比如单调栈。
而我角度错了的原因,就是没有将问题从模拟问题转化为有规律的问题,这样才能用代码实现!

2、官方的思路

将k分解为k = x + y,不断模拟两个数值数组的最大拼接,记录最大的那一个。
现在已经将问题规律化了,然后拆解小问题,就涉及到小知识点了
1.带remain的单调栈来取数值数数组指定长度最大子序列。
2.O(N)合并两个数值数组,使其该数值数组最大值。
3.两数值数组比较大小的处理方式。

3、源码

Java

class Solution {
    // target:从两个数组选出两组数据,合并倒序,就得到一个最大组合值。
    // 转换成有规律的问题。
    // 问题
    // 两数组肯定尽量单调(最大的那个单调),但是取出的单调栈合并长度并不一定为k
    // 如果两者合并长度大于等于k,倒排之后(依次选择),取前k个即可。
    // 如果不够k怎么办?

    // 调研思路
    // 将k分成 k = x + y,不断寻找x和y,然后拼接,比较,记录最大值。 
    public int[] maxNumber(int[] nums1, int[] nums2, int k) {
        int m = nums1.length,n = nums2.length;

        int start = Math.max(0,k - n);
        int end = Math.min(k,m);
        int[] maxRs = new int[k];
        // 强行分解k = x + y,进行遍历记录最大值。
        // hard-mark:问题转换(规律非模拟问题)+问题拆解(多个小知识点)+多个小问题的逻辑联系。
        for(int i = start;i <= end;i++){
            int[] seq1 = getSeq(nums1,i);
            int[] seq2 = getSeq(nums2,k - i);

            int[] curRs = merge(seq1,seq2);

            if(compare(maxRs,0,curRs,0) < 0) System.arraycopy(curRs,0,maxRs,0,k);
        }
        return maxRs;
    }
    // 知识点1:O(N)合并两个数值数组,使其该数值数组最大值。
    public int[] merge(int[] nums1,int[] nums2){
        int m = nums1.length,n = nums2.length;
        if(m == 0) return nums2;
        if(n == 0) return nums1;

        int i = 0,j = 0;
        int[] rs = new int[m + n];

        for(int k = 0;k < m + n;k++){
            if(compare(nums1,i,nums2,j) > 0) rs[k] = nums1[i++];
            else rs[k] = nums2[j++];
        }
        return rs;
    }
    // 知识点2:两数值数组比较大小,尽量返回int,而不是boolean
    public int compare(int[] nums1,int i,int[] nums2,int j){
        int m = nums1.length,n = nums2.length;

        while(i < m && j < n){
            int gap = nums1[i] - nums2[j];
            if(gap != 0) return gap;

            ++i;
            ++j;
        }
        return (m - i) - (n - j);
    }
    // 知识点3:单调减栈 配合 remain,可以做到求指定长度的最大子序列。
    public int[] getSeq(int[] nums,int k){
        int[] stack = new int[k];
        int top = 0,remain = nums.length - k;

        for(int cur : nums){
            while(top > 0 && stack[top - 1] < cur && remain > 0){
                top--;
                remain--;// 不需要的上限
            }
            if(top < k){
                stack[top++] = cur;
            }else remain--;
        }
        return stack;
    }
}

golang

func maxNumber(nums1 []int, nums2 []int, k int) []int {
    m,n := len(nums1),len(nums2)
    start,end := max(0,k - n),min(k,m)
    maxRs := make([]int,k)
    // k = x + y,取子序列,再合并,最后比较大小,并记录。
    for i := start;i <= end;i++ {
        seq1 := getSeq(nums1,i)
        seq2 := getSeq(nums2,k - i)

        curRs := merge(seq1,seq2)

        if compare(curRs,0,maxRs,0) > 0 {
            copy(maxRs,curRs)
        }
    }
    return maxRs
}
// 知识点1:O(N)合并两个数值数组,使其该数值数组最大值。
func merge(nums1 []int,nums2 []int) []int {
    m,n := len(nums1),len(nums2)
    if m == 0 {
        return nums2
    }
    if n == 0 {
        return nums1
    }
    i,j := 0,0
    rs := make([]int,m + n)
    for k := 0;k < m + n;k++ {
        if compare(nums1,i,nums2,j) > 0 {
            rs[k] = nums1[i]
            i++
        }else {
            rs[k] = nums2[j]
            j++
        }
    }
    return rs
}
// 知识点2:两数值数组比较大小,尽量返回int,而不是boolean
func compare(nums1 []int,i int,nums2 []int,j int) int {
    m,n := len(nums1),len(nums2)
    for ; i < m && j < n; {
        gap := nums1[i] - nums2[j]
        if gap != 0 {
            return gap
        }
        i++
        j++
    }
    return (m - i) - (n - j)
}
// 知识点3:单调减栈 配合 remain,可以做到求指定长度的最大子序列。
func getSeq(nums []int,k int) []int {
    stack := make([]int,k)
    top := 0
    remain := len(nums) - k

    for _,cur := range nums {
        for ; top > 0 && stack[top - 1] < cur && remain > 0; {
            top--;
            remain--;
        }
        if top < k {
            stack[top] = cur;
            top++
        }else {
            remain--
        }
    }
    return stack
}
// 取大值
func max(i int,j int) int {
    if i > j {
        return i
    }
    return j
}
// 取小值
func min(i int,j int) int {
    if i < j {
        return i
    }
    return j
}

总结

1)一个困难题,应该是先观其规律,再进行逻辑转换问题,再拆解小问题,用积累的知识点解决。
2)如果没有积累到/思考角度不对,就看题解,多调研,别浪费时间!
3)多解决困难题,对提升解决问题能力有帮助,但是这是长期提升,而短期需要找工作则边界收益不大,性价比低。

参考文献

[1] LeetCode 321.拼接最大数
[2] LeetCode 321.拼接最大数-官方题解
[3] go 数组copy用法
[4] go foreach用法

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

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

相关文章

S2SH志愿者捐赠管理系统|捐助计算机毕业论文Java项目源码下载

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《基于S2SH实现的志愿者捐赠管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 &#xff0c;项目含有源码、…

02、数据卷(Data Volumes)以及dockefile详解

目录 1、Docker 数据管理 2、数据卷(Data Volumes) 3、数据卷容器 4、dockerfile 5、dockerfile基本结构 6、docker使用Dockerfile创建jdk容器 启动虚拟机&#xff0c;进入CentOS 7、dockerfile实践经验 1、Docker 数据管理 在生产环境中使用 Docker &#xff0c;往往需…

混合动力电动车优化调度与建模(发动机,电机,电池组等组件建模)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

6-4布线问题(分支限界)

6-4布线问题&#xff08;分支限界&#xff09; 一、问题描述 印刷电路板将布线区域划分成m*n个方格阵列,如图(1)所示。 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。 在布线时,电路只能沿直线或直角布线,如图(2)所示。 为了避免线路相交&#xf…

C语言第十二课(下):操作符详解【逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性】

目录 前言&#xff1a; 一、逗号表达式&#xff08;exp1&#xff0c;exp2&#xff0c;exp3&#xff0c;...&#xff0c;expN&#xff09;&#xff1a; 二、下标引用、函数调用和结构成员[ ]、( )、. 、->&#xff1a; 1.下标引用操作符[ ]&#xff1a; 2.函数调用操作符( …

Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知

Tomcat 不但没有过时&#xff0c;Spring Boot 还给 Tomcat 第二春了。 微服务的兴起&#xff0c;Tomcat 针对很多应用已经做成 embedded 模式了&#xff0c;Tomcat 本身是容器&#xff0c;Tomcat 的出现就是为了解决但是 EJB 和 Weblogic&#xff0c;JBoss 这种大而全的大象导致…

C++ OpenCV【视频合并:多个图像拼接在一张图像】

提示&#xff1a;本文中视频拼接指的是将多张图像按空间合并在一张图像上&#xff0c;而不是将多张图像按时间顺序拼接成一个多帧片段。 文章目录 前言 一、OpenCV知识点 1.OpenCV裁剪矩形区域赋值 2.OpenCV将Mat粘贴到指定位置 二、程序样例 1.程序源码 2.运行结果 前言 C版…

[附源码]Python计算机毕业设计Django姜太公渔具销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

看完这篇,还不懂JAVA内存模型(JMM)算我输

前言 开篇一个例子&#xff0c;我看看都有谁会&#xff1f;如果不会的&#xff0c;或者不知道原理的&#xff0c;还是老老实实看完这篇文章吧。 Slf4j(topic "c.VolatileTest") public class VolatileTest {static boolean run true;public static void main(Str…

一个简单的HTML网页 个人网站设计与实现 HTML+CSS+JavaScript自适应个人相册展示留言博客模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Ubtunu排查磁盘空间是否已满—并清理的方式

项目场景&#xff1a; 最近使用nodejs开发的后端项目部署到Ubtunu服务器后接口无法访问了&#xff0c;接口也调用不通&#xff0c;NGINX报502错误。 问题描述 使用远程连接工具传文件也是无法上传&#xff0c;提示找不到文件&#xff0c;SCP命令也无法上传。 scp传文件报错&…

一文教会你如何在内网搭建一套属于自己小组的在线 API 文档?

Hello&#xff0c;大家好&#xff0c;我是阿粉&#xff0c;对接文档是每个开发人员不可避免都要写的&#xff0c;友好的文档可以大大的提升工作效率。 阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部署了一套实时的&#xff0c;使用起来特方便了。跟着…

第二证券|11月十大牛股出炉 特一药业163%涨幅问鼎榜首

到11月30日收盘&#xff0c;11月份十大牛股中7只个股涨幅超过100%&#xff0c;涨幅最小的也有87%&#xff0c;均匀涨幅较上个月有所扩大。 11月&#xff0c;A股出现震荡爬高态势&#xff0c;到11月30日收盘&#xff0c;上证指数月内涨8.91%&#xff0c;深证成指涨6.84%&#xf…

大学生HTML作业节日网页 HTML作业节日文化网页期末作业 html+css+js节日网页 HTML学生节日介绍 HTML学生作业网页视频

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

编号&#xff1a;27 基于STM32单片机的温湿度检测报警器&#xff08;数码管&#xff09; 功能描述&#xff1a; 本设计由STM32F103单片机最小系统DHT11温湿度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DHT11传感器测量温度和湿度数据…

Android注解快速入门和实用解析

首先什么是注解&#xff1f;Override就是注解&#xff0c;它的作用是&#xff1a; 1、检查是否正确的重写了父类中的方法。2、标明代码&#xff0c;这是一个重写的方法。1、体现在于&#xff1a;检查子类重写的方法名与参数类型是否正确&#xff1b;检查方法private&#xff0f…

带你走进知识图谱的世界

知识图谱知识图谱的介绍01 什么是知识图谱02 知识图谱构建的关键技术03 知识图谱的存储04 知识图谱在金融领域的应用图数据库 Neo4j知识图谱的介绍 知识图谱最开始是Google为了优化搜索引擎提出来的&#xff0c;推出之后引起了业界轰动&#xff0c;随后其他搜索公司也纷纷推出…

[附源码]计算机毕业设计医疗器械公司公告管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MXNet中im2rec将图片转换成二进制RecordIO格式

我们在前面的 计算机视觉之目标检测训练数据集&#xff08;皮卡丘&#xff09;《2》其中有提到这个二进制的RecordIO格式&#xff0c;使用的是MXNet自带的im2rec工具&#xff0c;源码在tools里面 import mxnet as mx #D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\…

农大毕业7年后,转行软件测试,我拿到了一块结实的敲门砖

“经过这段时间的学习&#xff0c;让我摸清了这个行业的游戏规则&#xff0c;可以说是让我拿到了一块结实的敲门砖。” 今天跟大家分享的是近期就业的学员刘同学的转行故事&#xff0c;希望他的经历能给同样在向梦想奔跑的你一些帮助。 毕业7年后&#xff0c;从网信办主任转行…