刷题day1
题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
思路
这里要我返回这个顺序递增的这个数组,最暴力就是平移+排序
然后我的思路是,你后面这个nums2, 他可以二分找到这个要插入的位置,然后这插入的这个位置是一个顺序set
对应每个nums2的元素都需要对nums1来进行二分,如果num1 n, nums2 m,那这里复杂度就是mlogn,然后这里我需要对每个插入的这些nums2的这些元素分别来做排序
也就是milogmi, sum mi = m;
每个桶大小 mi,排序 O(mi log mi),总和 O(Σ mi log mi),其中 Σmi = m
由于 Σ mi log mi ≤ m log m(当所有元素集中在一个桶时取等),所以排序部分上界是 O(m log m) 这部分我算不明白,总之这里放缩了
然后就总复杂度:O(m log n + m log m) = O(m log(mn))
但是这里有些边界条件,首先写个二分,如果这里mp[i]表示插入到num1[i]后的,那有可能找不到,那就是0,反之就是n,有些边界条件,估计要调试一会儿。
1 | class Solution { |
然后实际上这个题最好的解法是双指针,就你搞个新的大数组对吧?然后他每次一定能从你这其他这俩数组塞一个进去,然后每次数组的index都能–,然后被塞的那个也能–,就逆序塞满了,还没有边界条件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wellorbetter's blog!





