面试经典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日
    浏览(11)
  • 面试经典150题——生命游戏

    面试经典150题——生命游戏

    2.1 思路一——暴力求解 之所以先暴力求解,是因为我开始也没什么更好的思路,所以就先写一种解决方案,没准写着写着就来新的灵感了。暴力求解思路还是很简单的,就是尝试遍历面板的每个格子,判断其周围八个位置的状态(对于边角需要特殊处理),根据边角种存在

    2024年02月21日
    浏览(11)
  • 面试经典 150 题 - 多数元素

    面试经典 150 题 - 多数元素

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

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

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

    2024年01月19日
    浏览(5)
  • 面试经典150题(88-89)

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

    2024年01月18日
    浏览(9)
  • 面试经典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日
    浏览(7)
  • 面试经典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日
    浏览(12)
  • 面试经典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日
    浏览(15)
  • 【面试经典150 | 矩阵】矩阵置零

    【面试经典150 | 矩阵】矩阵置零

    本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删: Tag:介绍本题牵涉到的知识点、数据结构; 题目来源:

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

    11. Container With Most Water You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]). Find two lines that together with the x-axis form a container, such that the container contains the most water. Return the maximum amount of water a container can store. N

    2024年02月06日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包