面试经典150题(1)

这篇具有很好参考价值的文章主要介绍了面试经典150题(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面试经典150题(1)

前言

今天开始我将陆续为大家更新面试经典150题中较难理解的题目。今天我为大家分享的是,除自身以外数组的乘积、跳跃游戏| 和 跳跃游戏||。

除自身以外数组的乘积

除自身以外数组的乘积

要求

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请不要使用除法,且在 O(n) 时间复杂度内完成此题

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

class Solution {
    public int[] productExceptSelf(int[] nums) {

    }
}

思路

按照一般的思路,我们可能会想:先将数组中所有的元素相乘得到一个sum,然后再遍历一遍数组,answer[i] = sum / nums[i],如果nums[i] = 0,answer[i] = sum。但是这个题目要求我们不使用除法,那么我们该怎么办呢?因为是除自身以外的数组的乘积,自身以外的数组被分为左右两部分,我们只需要将 左边部分数组元素的乘积 x 右边部分数组元素的乘积 就得到除自身以外的数组的乘积。所以我们可以使用两个数组L和R来分别存储数组第 i 个元素左边部分数组元素的乘积和右边部分数组元素的乘积,最后再遍历一遍数组,answer[i] = L[i] * R[i]。

面试经典150题(1)

代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] answer = new int[n];
        int[] L = new int[n];
        int[] R = new int[n];
        L[0] = 1;
        for(int i = 1; i < n; i++) {
        //L[i]等于前i-2个数的乘积乘上第i-1个数
            L[i] = L[i-1] * nums[i-1];
        } 
        R[n-1] = 1;
        for(int i = n - 2; i >= 0; i--) {
        //R[i]等于后 length-i-2 个数的乘积乘上第 length-i-1个数
            R[i] = R[i+1] * nums[i+1];
        }

        for(int i = 0; i < n; i++) {
            answer[i] = L[i] * R[i];
        }

        return answer;
    }
}

面试经典150题(1)

跳跃游戏|

跳跃游戏|

要求

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

class Solution {
    public int jump(int[] nums) {

    }
}

题解

其实这个题目可以换一种理解方式:在某位置的跳跃范围内时候有某一位置可以跳跃到最后一个下标处。我们可以使用 rightmost 来记录在某位置的跳跃范围内的最大跳跃位置, 最大跳跃位置 = i + nums[i] 如果 rightmost >= length-1,那么说明可以到达最后一个下标处。

面试经典150题(1)

代码

class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        int rightmost = 0;
        for(int i = 0; i < n; i++) {
            if(i <= rightmost) {
                rightmost = Math.max(rightmost,i + nums[i]);
                if(rightmost >= n-1) {
                    return true;
                }
            }
        }
        return false;
    }
}

面试经典150题(1)

跳跃游戏||

跳跃游戏||

要求

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]
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

class Solution {
    public int jump(int[] nums) {

    }
}

题解

因为题目中说生成的测试用例可以到达nums[i-1],求最小的跳跃次数。所以我们每次跳跃的位置就是在跳跃区间中能跳跃最远的位置。并且在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次「不必要的跳跃次数」,因此我们不必访问最后一个元素。
面试经典150题(1)

代码

class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int rightmost = 0;
        //end用来记录跳跃区间
        int end = 0;
        int step = 0;
        for(int i = 0; i < n - 1; i++) {
            rightmost = Math.max(rightmost,i + nums[i]);
            if(i == end) {
                end = rightmost;
                step++;
            }
        }

        return step;
    }
}

面试经典150题(1)文章来源地址https://www.toymoban.com/news/detail-495418.html

到了这里,关于面试经典150题(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试经典150题(85-87)

    leetcode 150道题 计划花两个月时候刷完,今天(第四十三天)完成了3道(85-87)150: 85.(77. 组合)题目描述: 第一版(昨天就是这个卡了好久没弄出来,今天还是没思路啊。。看了解题,感觉都是一个for 然后for里面嵌套。看看解题的代码吧) 86.(46. 全排列)题目描述: 第一版

    2024年01月18日
    浏览(37)
  • 面试经典150题(78-81)

    leetcode 150道题 计划花两个月时候刷完,今天(第三十六天)完成了4道(78-81)150: 78.(230. 二叉搜索树中第K小的元素)题目描述: 第一版(铭记!!二叉搜索树的中序遍历为递增的) 79.(98. 验证二叉搜索树)题目描述: 第一版(我第一反应就是递归,但是递归了好久没弄出

    2024年02月02日
    浏览(40)
  • 面试经典150题(88-89)

    leetcode 150道题 计划花两个月时候刷完,今天(第四十四天)完成了2道(88-89)150: 88.(22. 括号生成) 题目描述: 第一版(没通过,我想法是 ()的全排列然后找出来符合的并且去重。。超时了) 第二版(看了解题) 89.(79. 单词搜索)题目描述: 第一版(没超时,但是效率垫

    2024年01月18日
    浏览(43)
  • 面试经典150题(82-83)

    leetcode 150道题 计划花两个月时候刷完,今天(第四十一天)完成了2道(82-83)150: 82.(133. 克隆图)题目描述: 第一版(这个之前有过是拷贝二叉树的时候和这个类似,利用map 映射就是当前节点和当前节点的复制节点) 第83题顺序应该是 leetcode 的 《399. 除法求值》但是实在是

    2024年01月19日
    浏览(36)
  • 面试经典 150 题 - 多数元素

    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums = [3,2,3] 输出:3 示例 2: 输入:nums = [2,2,1,1,1,2,2] 输出:2 进阶:尝试设计时间复

    2024年01月23日
    浏览(39)
  • 【面试经典150 | 动态规划】零钱兑换

    【动态规划】【数组】 322. 零钱兑换 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i ,如果当前的金额可以使用面额数组中的某个面额 coin 凑成总金额的一部分,则可以更新 d p [ i ] = m i n ( d p [ i ] , d p [ i − c o i n ] + 1 ) dp[i] = min(dp[i

    2024年04月16日
    浏览(72)
  • 面试经典150题——Day26

    392. Is Subsequence Given two strings s and t, return true if s is a subsequence of t, or false otherwise. A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., “ace” is a subsequence of “abcde” wh

    2024年02月06日
    浏览(54)
  • 面试经典150题——Day18

    12. Integer to Roman Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example, 2 is written as II in Roman numeral, just two one’s added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II. Roman numerals are u

    2024年02月08日
    浏览(41)
  • 面试经典150题——Day31

    3. Longest Substring Without Repeating Characters Given a string s, find the length of the longest substring without repeating characters. Example 1: Input: s = “abcabcbb” Output: 3 Explanation: The answer is “abc”, with the length of 3. Example 2: Input: s = “bbbbb” Output: 1 Explanation: The answer is “b”, with the length of 1. Example 3: I

    2024年02月05日
    浏览(49)
  • 面试经典150题——Day29

    15. 3Sum Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set must not contain duplicate triplets. Example 1: Input: nums = [-1,0,1,2,-1,-4] Output: [[-1,-1,2],[-1,0,1]] Explanation: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 =

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包