当前位置:   article > 正文

华为今年的校招薪资,最高年薪90万。。。

华为2024校招待遇

今天看了一下华为的校招薪资,前面都很正常,月薪基本上都是在2-3万之间,和我们前面看的腾讯,字节都差不多。到后面的时候看到一个年薪90万的,不得不说真的是很羡慕,岗位是算法研究岗,所以要想拿到高薪还得搞算法,不过学历要求也高,这个90万年薪的还是985博士。

3d98ec0080a1b4201015a7f8ad87da67.jpeg

48b97a9404ed8d203ebcca79b65c9a45.jpeg

07ffdd86dff7d5c7a95a27ef31bff13b.jpeg

数据来源:OfferShow

为了毕业之后也能拿到华为90万的年薪(梦想还是要有的),我们一定要把算法学好,今天我们就来看一道华为常考的算法题,有很多网友在华为的面试中遇到过这题,这题就是LeetCode的第45题:跳跃游戏 II。除了华为考过,字节,百度,阿里等大厂也都考过。

177a908c7b09beac6452b4babfc68b93.png

0e679e3bb8c0af7011da3c6a38f4b80b.png

问题描述

来源:LeetCode第45题

难度:中等

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

1.  0 <= j <= nums[i] 

2.  i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例1:

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

输出: 2

解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例2:

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

输出: 2

  • 1 <= nums.length <= 10^4

  • 0 <= nums[i] <= 1000

  • 题目保证可以到达 nums[n-1]

贪心算法解决

这题让计算的是跳到数组的最后需要跳跃的最小次数,第一次跳跃是站在下标为0的位置开始跳的。

我们可以用一个变量preRange表示上一次跳跃所能到达的范围,然后在这个范围内记录跳跃所能达到的最远距离curFarthest,计算的时候如果超过preRange这个范围就表示需要再跳一次,然后更新preRange的值为curFarthest。

我们以示例一为例画个图来看下,第一次可以跳跃的范围是[1,2],这里指的是下标,实际上还可以跳到下标为0的位置,如果第一次还跳到下标为0就表示没跳,我们不要记录了。

第二次可以从下标为1或下标为2的位置开始跳,从下标为1的位置可以跳到[2,3,4],从下标为2的位置可以跳到[3],所以第二次就可以跳到数组的末尾了,只需要两次即可。

11f7d1233e90afb6ce46bae7901ebce4.png

JAVA:

  1. public int jump(int[] nums) {
  2.     int jumps = 0;// 最小跳跃次数
  3.     int preRange = 0;// 上一次起跳的范围
  4.     int curFarthest = 0;// 从上一次起跳范围内所能跳的最远距离。
  5.     for (int i = 0; i < nums.length - 1; i++) {
  6.         // 计算从当前位置跳跃所能到大的最远距离,并更新curFarthest。
  7.         curFarthest = Math.max(curFarthest, i + nums[i]);
  8.         // 如果上一个跳远范围内都计算完了,就要重新开始跳了。
  9.         if (i == preRange) {
  10.             jumps++;
  11.             preRange = curFarthest;
  12.         }
  13.     }
  14.     return jumps;
  15. }

C++:

  1. public:
  2.     int jump(vector<int>& nums) {
  3.         int jumps = 0;// 最小跳跃次数
  4.         int preRange = 0;// 上一次起跳的范围
  5.         int curFarthest = 0;// 从上一次起跳范围内所能跳的最远距离。
  6.         for (int i = 0; i < nums.size() - 1; i++) {
  7.             // 计算从当前位置跳跃所能到大的最远距离,并更新curFarthest。
  8.             curFarthest = max(curFarthest, i + nums[i]);
  9.             // 如果上一个跳远范围内都计算完了,就要重新开始跳了。
  10.             if (i == preRange) {
  11.                 jumps++;
  12.                 preRange = curFarthest;
  13.             }
  14.         }
  15.         return jumps;
  16.     }

Python:

  1. def jump(self, nums: List[int]) -> int:
  2.     # 最小跳跃次数
  3.     # 上一次起跳的范围
  4.     # 从上一次起跳范围内所能跳的最远距离。
  5.     jumps, preRange, curFarthest = 000
  6.     for i in range(len(nums) - 1):
  7.         # 计算从当前位置跳跃所能到大的最远距离,并更新curFarthest。
  8.         curFarthest = max(curFarthest, i + nums[i])
  9.         # 如果上一个跳远范围内都计算完了,就要重新开始跳了。
  10.         if i == preRange:
  11.             jumps += 1
  12.             preRange = curFarthest
  13.     return jumps

3b9ffbcddf4351cfc0192184e53f385d.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号