力扣面试经典150题day1第一题(lc88),第二题(lc27)

文章目录


一、lc88 合并两个有序数组

O((M+N)Log(M+N))时间复杂度

直接把nums2数组拼接到nums1数组后面,再调用sort函数排序,代码如下,需要注意nums1数组长度为0这个特殊情况

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if(m==0){
            for(int i=0;i<n;i++){
                nums1[i] = nums2[i];
            }
        }
        else{
            for(int i=0 ; i < n;i++){
                nums1[m+i] = nums2[i];
            }
            Arrays.sort(nums1);
        }
        
    }
}

O(M+N)时间复杂度

逆向考虑问题,设置三个指针i,j,k,分别表示nums1还剩数据长度,nums2还剩数据长度,下一个插入位置,当i,j不为0时,对numsi-1和nums2j-1进行大小比较,大的插入到nums1k-1位置(长度从1开始计算,数组下标从0开始,所以需要减一),再移动i,j,当i,j其中一个插入完毕后循环退出,如果i不为0,表示nums1上还有数据未遍历到,但已经在返回数组上了,不需要额外操作,如果j不为0,遍历nums2剩下的数据插入到nums1前面。

对于从后插入是否会覆盖数据:因为两个数组已经按非递减排序,所以不会

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if(m==0){
            for(int i=0;i<n;i++){
                nums1[i] = nums2[i];
            }
        }
        else{
            int i=m,j=n,k=m+n;
            while(i>0 && j>0){
                if(nums1[i-1]>=nums2[j-1]){
                    nums1[k-1]=nums1[i-1];
                    i--;
                }
                else{
                    nums1[k-1]=nums2[j-1];
                    j--;
                }
                k--;
            }
            if(j>0){
                for(int s = 0; s<j;s++){
                    nums1[s]=nums2[s];
                }
            }
        }
        
    }
}

二、lc27移除元素

添加辅助数组

遍历nums数组,把非val元素放入辅助数组ans中,遍历完成后,把ans数组的数据放回nums数组前面

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        
        int n = nums.length-1;
        if(n<0) return 0;
        int k=0;
        int[] ans = new int[n+1];
        for(int i = 0;i<=n;i++){
            if(nums[i]!=val){
                ans[k]=nums[i];
                k++;
            }
        }
        if(k>0){
            for(int i=0;i<k;i++){
                nums[i]=ans[i];
        }
        }
        
        return k;
    }
}

2.原数组拷贝

遍历nums数组,如果取出的num不等于val就进行拷贝,再ans+1,如果相等,继续遍历

此方法本质上为快慢指针,num元素下标为快指针,遍历整个数组,ans为慢指针,为下一个插入非val元素的位置

java 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int ans = 0;
        for(int num: nums) {
            if(num != val) {
                nums[ans] = num;
                ans++;
            }
        }
        return ans;
    }
}

相关推荐
苦瓜小生18 分钟前
AI名词大扫盲!最全的面试ai名词集合
人工智能·面试
KaMeidebaby19 分钟前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao40 分钟前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
龙虾PRO42 分钟前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展
uzong1 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
圣保罗的大教堂2 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode
wdfk_prog4 小时前
嵌入式面试真题第 12 题:资源受限长期运行系统的确定性内存管理与内存池架构设计
考研·面试·职场和发展
青山木4 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务4 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报5 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法