数组基础面试题整理

这篇博客整理了数组基础面试题,包括合并两个排序数组的高效方法,如何找到两个数组的第K大的数,解决股票最佳买卖时机问题,删除数组重复元素以及寻找数组中两数之和的下标。重点讨论了在限制额外空间的情况下优化算法的方法。
摘要由CSDN通过智能技术生成

合并两个排序数组

经典的归并排序有两个指针left right mid 我们在【left,mid】【mid+1,end】两个区间里选谁小就让谁进入temp数组中

  • 但这道题的区别在于 不希望有额外空间复杂度 因为已经说明A的后面有大量空间可以用来安放B的元素
  • 区别2 由于没有额外空间而对A赋值会造成大量的数组元素移动 浪费时间
    应当想到剑指offer中的happy字符串代替 是提前计算好长度 从后边开始添加这样就不会造成移动带来的低效率 7

两个数组的第K大的数

在这里插入图片描述

import java.util.*;
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
     int len=nums1.length+nums2.length;
     if(len%2==1)
     {
         return findKthNum(nums1,nums2,0,0,len/2+1);
     }
     else
     {
         return (findKthNum(nums1,nums2,0,0,len/2)+ findKthNum(nums1,nums2,0,0,len/2+1))/2.0;
     }
    }
    public double findKthNum(int []A,int []B,int aStart,int bStart,int k)
    {
         if(aStart>=A.length)
         {
           return B[bStart+k-1];
         }
         if(bStart>=B.length)
         {
             return A[aStart+k-1];
         }
           if(k==1)
         {
             return Math.min(A[aStart],B[bStart]);
         }
         int A_key=aStart+k/2-1<A.length?A[aStart+k/2-1]:Integer.MAX_VALUE;
         int B_key=bStart+k/2-1<B.length?B[bStart+k/2-1]:Integer.MAX_VALUE;
         if(A_key<B_key)
         {
             return findKthNum(A,B,aStart+k/2,bStart,k-k/2);
         }
         else
         {
             return findKthNum(A,B,aStart,bStart+k/2,k-k/2);
         }
    }
}

看到log就想到二分法
二分法就是舍掉一半 在数组中舍掉一半就是划范围
在这里找第K大的就先去找第K/2大的 每次删除一半
在数组中第K大 比如第一大 其实应该放在0的位置 所以k-1

  • 比较A和B谁的start+k/2-1更小 小的话就直接删除这一半 毕竟之后肯定用不到我们要找的是第K大 小于K/2的肯定不符合要求
  • 所以每次再从第K/2+start-1+1规划数组的范围 接下来我们去找第k-k/2个数因为前面的k/2个数已经删除了 我们本来要找的是第K个数 现在k/2的数字被删除 就再数组里找k-k/2
  • 不断地找不断地删除k/2个 不断地去找下k-k/2个数字 递归的变量已经出现就是两个数组的start在变化 当前的第K个数在变化
  • 变量终究会出现第K个数已经是1 不用再分就是当前的范围下数组头谁最小
    start不断的后移当已经后移到比length还大 或者一开始的length就很小我们找第K个数 比length都大 那就没法遍历当前这个start冒了的数组 而是要找另一个数组的k-1下标元素
    在这里插入图片描述
    在这里插入图片描述
股票的最好买卖时机

在这里插入图片描述
在这里插入图片描述

删除数组中重复数字(全部/保留一个)

如何去除有序数组的重复元素
在这里插入图片描述

给定target在数组中找到两数之和并且返回下标

三个数之和

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值