专栏名称: 猿大侠
猿大侠,既然选择了,就一定成为大侠! 小程序、小游戏、Google、苹果、职场、前沿技术分享,一起成长。
目录
相关文章推荐
sven_shi  ·  我回答了 @艾尔之风 ... ·  昨天  
台州交通广播  ·  即将迎来!就在今天10时33分 ·  昨天  
掌上铜山  ·  雷军官宣! ·  昨天  
掌上铜山  ·  雷军官宣! ·  昨天  
第1眼新闻  ·  直击“心巴”!微信这波更新爱了爱了🤩 ·  2 天前  
第1眼新闻  ·  直击“心巴”!微信这波更新爱了爱了🤩 ·  2 天前  
网信浙江  ·  浙江网信12月执法处置通报|浙E执法 ·  3 天前  
网信浙江  ·  浙江网信12月执法处置通报|浙E执法 ·  3 天前  
51好读  ›  专栏  ›  猿大侠

为什么华为在亲戚长辈面前风评这么好。

猿大侠  · 公众号  · 互联网安全 科技自媒体  · 2025-01-01 12:08

主要观点总结

本文讨论了华为公司的薪资与职级制度以及LeetCode第162题:寻找峰值。第一部分介绍了华为员工薪资的普遍认知及达到高薪的职级和难度。第二部分详细描述了寻找峰值的问题、要求、示例、分析和Java、C++、Python的解法。

关键观点总结

关键观点1: 华为公司的薪资与职级制度

介绍了华为员工年薪百万的可能性及达到这一水平的难度和所需时间。

关键观点2: LeetCode第162题:寻找峰值

描述问题、要求、示例、分析及Java、C++、Python的解法。


正文

一网友说为什么华子在亲戚长辈面前风评那么好,一听说签了华为都认为是年薪百万。在华为年薪百万也不是不可能,但至少要18级以上。大约7、8年能升到16级,再往上升就较难。18级以下占比最多,18级是个坎,往上升需要重新考评,答辩。如果没有特殊招聘,一般需要十年以上的时间才能达到18级,也就相当于35岁之后了。







--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第162题:寻找峰值。


问题描述



来源:LeetCode第162题
难度:中等

峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回 任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例1:

输入:nums = [1,2,3,1]

输出:2

解释:3 是峰值元素,你的函数应该返回其索引 2。

示例2:

输入:nums = [1,2,1,3,5,6,4]

输出:1 或 5

解释:你的函数可以返回索引 1,其峰值元素为 2;

     或者返回索引 5, 其峰值元素为 6。


  • 1 <= nums.length <= 1000

  • -2^31 <= nums[i] <= 2^31 - 1

  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]


问题分析



这题让找出数组中的峰值,因为nums[-1] = nums[n] = -∞ ,也就是默认数组两边的值(实际上是不存在的)是负无穷大,所以数组中肯定是有峰值的。如果没有时间复杂度的限制,这题就是一道非常简单的题,直接遍历数组中的每个值然后与两边比较即可。

但这题要求的时间复杂度是O(log n) ,所以我们只能使用二分查找,每次用中间的值nums[mid]和它的下一个值nums[mid+1]比较哪个大,因为提示中说了对于所有有效的 i 都有 nums[i] != nums[i + 1],所以大的那边一定有峰值。

JAVA:
public int findPeakElement(int[] nums) {
    int left = 0;
    int right = nums.length - 1;
    while (left         int mid1 = (left + right) >>> 1;
        int mid2 = mid1 + 1;
        if (nums[mid1]             left = mid2;// 右边肯定有峰值
        else
            right = mid1;// 左边肯定有峰值
    }
    return left;
}

C++:
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while (left             int mid1 = left +(right-left)/2;
            int mid2 = mid1 + 1;
            if (nums[mid1]                 left = mid2;// 右边肯定有峰值
            else
                right = mid1;// 左边肯定有峰值
        }
        return left;
    }

Python:
def findPeakElement(self, nums: List[int]) -> int:
    left, right = 0, len(nums) - 1
    while left         mid1 = left + ((right - left) >> 1)
        mid2 = mid1 + 1
        if nums[mid1]             left = mid2  # 右边肯定有峰值
        else:
            right = mid1  # 左边肯定有峰值
    return left