首页 > 其他分享 >面试经典150题(第1题)

面试经典150题(第1题)

时间:2023-09-06 22:56:36浏览次数:57  
标签:150 存储 int 元素 面试 数组 经典 nums1 nums2


准大三生,最近一直在准备寒假实习,想要每天坚持刷Leetcode上面的一些经典面试算法题,选定了掘金作为自己的记录的平台!

面试经典150题
数组/字符串
合并两个有序数组(https://leetcode.cn/studyplan/top-interview-150/)

题目:给你两个按 非递减顺序 排列的整数数组 `nums1` 和 `nums2`,另有两个整数 `m` 和 `n` ,分别表示 `nums1` 和 `nums2` 中的元素数目。请你 合并`nums2` 到 `nums1` 中,使合并后的数组同样按 非递减顺序排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 `nums1` 中。为了应对这种情况,`nums1` 的初始长度为 `m + n`,其中前 `m` 个元素表示应合并的元素,后 `n` 个元素为 `0` ,应忽略。`nums2` 的长度为 `n` 。

不用多想,若是单纯考虑最小的时间复杂度以及空间复杂度下完成,一般是采用双指针,题目中刚好要求要让合并后的元素存储进nums1数组中,则此时的空间复杂度相对来说也是极小的,我们可以沿着此思路进行求解:

1、刚开始的思路
对于nums1数组,采用双指针,从左到右依次进行存储,在存储之前进行比较nums1和nums2的元素大小(本质上就是先选择小的元素放置在nums1数组中的左侧)

代码如下:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int k = 0,  i = 0, j = 0;
        while(k < m + n){
            if( i >= m){
                nums1[k] = nums2[j];
                j++;
            }else if( j >= n){
                nums1[k] = nums1[i];
                i++; 
            }else if(nums1[i] <= nums2[j]){
                nums1[k] = nums1[i];
                i++;
            }else{
                nums1[k] = nums2[j];
                j++;
            }
            k++;
        }
    }
};

  问题是将两个数组中每次比较较小的元素往nums1中存储的时候,有可能会产生覆盖的情况,因为若是nums2中元素存储的过快,然后nums1中的指针i记录的比较的数组元素将会被更新的nums1的元素覆盖,造成最终生成的数组会出现多个一样的值!

解决办法:若是想要采用这种办法必须重新定义一个数组,将nums1和nums2中的元素全部存储进去后,最后一个for循环拷贝所有的进入
nums1数组即可!缺点是耗费额外的空间,空间复杂度直接增大一倍!

2.相对来说,较优的思路

想了好久,从评论区看到的解题思路,为了避免使用额外的空间,合理使用nums1数组的空间,这里对于nums1和nums2原始数据采用从右边向左的存储进行,即从大到小

相关代码也是要简单不少:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int k = m + n - 1,  i = m - 1, j = n - 1;
        //参考题解,从后往前进行
        while(k >= 0){
            if(i >= 0 && j >= 0){
                if(nums1[i] >= nums2[j]){
                    nums1[k] = nums1[i];
                    i--;
                }else{
                    nums1[k] = nums2[j];
                    j--;
                }
            }else if(j >= 0 && i < 0){
                    while(j >= 0){
                        nums1[j] = nums2[j];
                        j--;
                    }
                    break;
            }else{
                break;
            }
            k--;
        }   
    }
};

2023年9月6号

标签:150,存储,int,元素,面试,数组,经典,nums1,nums2
From: https://www.cnblogs.com/yysnff/p/17683616.html

相关文章

  • Linux运维工程师面试题(8)
    Linux运维工程师面试题(8)祝各位小伙伴们早日找到自己心仪的工作。持续学习才不会被淘汰。地球不爆炸,我们不放假。机会总是留给有有准备的人的。加油,打工人!1docker的网络类型,使用场景none:在使用none模式后,Docker容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此......
  • 15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized
    Synchronized本篇文章将围绕synchronized关键字,使用大量图片、案例深入浅出的描述CAS、synchronizedJava层面和C++层面的实现、锁升级的原理、源码等大概观看时间17分钟可以带着几个问题去查看本文,如果认真看完,问题都会迎刃而解:1、synchronized是怎么使用的?在Java层面是如何......
  • 聊聊前端面试经常出现的点
    1、css选择器优先级关系!important>内联样式>ID选择器>类选择器=属性选择器=伪类选择器>标签选择器=伪元素选择器>通配符选择器!important是顶级选择器,不管写在哪甚至都可以无视JavaScript的样式设置!2、css浏览器兼容性问题的解决方法浏览器CSS样式初始化(比如:*{ma......
  • Android程序员面试技巧有哪些?这5个技巧码住
    很多Android程序员掌握的知识、技术非常过关,但是在面试的过程中不一定能完完全全地展现出来,面试效果不好极大影响着就业成功率以及薪资水平。所以大家在面试的时候,最好还是提前做做准备,掌握一些技巧更好。1、自我介绍一般面试面试,HR会让我们做一个自我介绍,但凡有一点准备的人,都会事......
  • 构建可扩展的应用:六边形架构详解与实践 【含面试题】
    面试题分享2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、AI讲话、翻译,GPU点亮AI想象空间史上最全文档AI绘画stablediffusion资......
  • Linux运维工程师面试题(7)
    Linux运维工程师面试题(7)祝各位小伙伴们早日找到自己心仪的工作。持续学习才不会被淘汰。地球不爆炸,我们不放假。机会总是留给有有准备的人的。加油,打工人!1常用的ansible模块有哪些PingCommandShellScriptCopyFetchFileYumServiceUserGroupLineinfileRepla......
  • Linux运维工程师面试题(7)
    目录Linux运维工程师面试题(7)1常用的ansible模块有哪些2说一下ansible使用roles编排的目录结构3docker六大命名空间namespace4cgroups的作用5runc的作用6docker常用的命令7docker存储引擎有哪些,区别是什么8进入docker容器有几种方法,区别是什么9Dockerfile......
  • 【金九银十】Android 程序员面试攻略:技巧、策略和心理准备
    前言面试对于求职者来说是一次非常重要的机会,通过面试,你可以展示自己的技能和经验,以及与面试官沟通交流。下面提供一些技巧、策略和心理准备方面的建议。技巧:1、深入研究目标公司和职位:了解公司的业务模式、技术栈以及他们最近的项目。这样可以展现你对公司的兴趣,并为回答问题提供......
  • Java 十大必读经典书籍推荐
    今天给大家推荐十本学习Java语言必读经典书籍,它们经过了无数人的口口相传,都已成为了Java领域顶级的经典名著。 1、Java核心技术·卷I·基础知识豆瓣评分:9.4Java领域极有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。本书由拥有20多年......
  • Android并发编程高级面试题汇总(含详细解析 十七)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......