刷题小记录1

161 阅读1分钟

二分

如果不是会二分,我就要遍历数组找 target 了(暴力法),但是因为这道题要求了 log 复杂度的算法,而且数组有序,元素唯一,自然就想到了二分。然后关于二分,重要的是循环不变量的定义,因为我用的是左闭右闭区间,也就是在改变查找区间的时候,最左元素和最右元素都在查找区间,所以在缩小区间的时候,我用的都是 mid - 1 或者 mid + 1 来调整。因为不会断的减半查找区间,因此复杂度是 log 复杂度;

移除元素

暴力法的话是先用一层循环找元素然后找到以后在来一层循环把后边所有元素都给挪过来从当前 target 的位置开始覆盖一遍,也就是相当于把后边所有元素往前边挪一位。这个是 O(n^2) 的算法。

利用双指针可以降维成 O(n),利用快慢指针思想当当前遍历到的元素不是 target 的时候,移动双指针,如果是 target 只移动快指针,然后在移动慢指针的时候不断地覆盖元素,这样可以移动所有的非 target 元素到前面,而且记录下来的慢指针就是 k,这样由于只遍历了一遍数组,复杂度是 O(n)