week17

162 - 寻找峰值

算是比较基础的二分,根据相邻元素是递增还是递减判断分界点就好

(这里没有单调性也可以用二分)

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int n = nums.size() - 1;
        int l = 0, r = n;
        while(l < r)
        {
            int mid = l + r >> 1;
            //if(mid == n || nums[mid] > nums[mid + 1]) r = mid;
            // 这里mid一定不会取到n 为什么 : 反证法
            if(nums[mid > nums[mid + 1]]) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};

164 - 最大间距

这题是真的很神奇... 方法记一下吧hh

avatar

这题的前提在于将整个区间成连续的小区间,保证最大差值一定不会出现在区间内的两个元素中

这个保证很重要,通过这样的构造就可以实现最大差值的两个元素一定在不同区间之内

区间的长度X 计算方法:首先统计整个数组的最大值Max 和 最小值Min,区间为左开右闭

那么在区间内,最大的差值为x - 1

假设最大差值出现在区间的两个元素中, 那么所有的相邻元素差值都应该小于等于x - 1

共有n - 1 个区间,则必然满足 (n - 1) * (x - 1) >= Max - Min + 1

反过来,如果 (n - 1) * (x - 1) < Max - Min 那么最大差值一定不会出现在区间内

有这个假设,我们维持区间, 最后计算区间和区间之间的相邻元素差值即可;

165 - 比较版本号

基础的模拟题 字符串转数字的常用方法 再比较就可以了

166 - 分数到小数

结果一定是有限小数 / 无限循环小数

余数相同 -> 出现相同的循环节

可能结果会爆INT(用long long来存) e.g. INT_MIN / (-1)

这部分的代码还挺值得好好写写的 mark住

167 - 两数之和II - 输入有序数组

经典的双指针了

168 - Excel表列名称

这个题和二十六进制数转换还是有点区别的, 主要是是126的映射,而不是 像正常的k进制数转换一样是在025

所以要加一些额外处理, 除26余0 实际上就是这一位可以被26整除 代表的应该是Z

以十进制数举例来说, 10 实际上是两位数字:

  • 第一次除10: 等于1 余0

  • 第二次除10: 等于0 余1

这里的逻辑就相当于把10当一整个数字看待,处理这个就是当余数为0的时候单独处理就好;

169 - 多数元素

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题

是很经典的一个题,要好好记下才行

两个变量: - r : 表示当前存储的数字 - c : 当前数的数量

从前到后扫描一次, 如果x = r 则统计次数c++, 否则c--;

如果c = 0, 那么更新r为当前遍历到的元素

这样最后剩下的元素一定是出现次数最多的; 思路很难想但是记下了就好了(x

代码很简单

Last updated