首页 > 编程语言 >【前端面经】数组算法题解

【前端面经】数组算法题解

时间:2024-06-18 12:30:38浏览次数:12  
标签:map 元素 nums 题解 complement 面经 算法 数组 nums1

目录

题目一:两数之和

描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能重复出现。

示例

输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解释:因为 nums[0] + nums[1] = 2 + 7 = 9

技巧和思路

  • 哈希表:使用哈希表来存储数组中的元素及其下标。遍历数组时,每次检查当前元素是否存在于哈希表中。如果存在,则找到了一组和为目标值的元素;如果不存在,则将当前元素和下标存入哈希表。

代码实现

function twoSum(nums, target) {
    let map = new Map();
    for (let i = 0; i < nums.length; i++) {
        let complement = target - nums[i];
        if (map.has(complement)) {
            return [map.get(complement), i];
        }
        map.set(nums[i], i);
    }
    return [];
}

在这段代码中:

  1. map 是一个 JavaScript Map 对象,用于存储数组元素及其下标。
  2. 循环遍历数组 nums
  3. 对于每个元素 nums[i],计算 complement = target - nums[i],即当前元素需要搭配的另一个数。
  4. 检查 map 中是否存在这个 complement。如果存在,说明找到了两个数,它们的和等于 target
  5. map.get(complement) 返回 complement 在数组中的下标,i 是当前元素的下标。所以 return [map.get(complement), i]; 返回的是这两个数的下标。

示例解释
假设输入 nums = [2, 7, 11, 15]target = 9

  • 初始化一个空的 Map
  • 第一次循环:i = 0nums[0] = 2,计算 complement = 9 - 2 = 7map 中没有 7,所以将 2 存入 map,变为 map = {2: 0}
  • 第二次循环:i = 1nums[1] = 7,计算 complement = 9 - 7 = 2map 中有 2,其下标为 0。所以返回 [map.get(2), 1],即 [0, 1]

返回的 [0, 1] 表示数组 nums 中下标为 01 的两个元素(即 27),它们的和等于目标值 9

题目二:最长无重复字符子串

描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

示例

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

技巧和思路

  • 滑动窗口:使用两个指针来表示字符串的当前窗口。右指针不断向右移动,扩展窗口,如果遇到重复字符,则移动左指针,缩小窗口。用一个集合来记录窗口中的字符,保持窗口内字符不重复。

代码实现

function lengthOfLongestSubstring(s) {
    let set = new Set();
    let left = 0, right = 0;
    let maxLength = 0;
    
    while (right < s.length) {
        if (!set.has(s[right])) {
            set.add(s[right]);
            maxLength = Math.max(maxLength, right - left + 1);
            right++;
        } else {
            set.delete(s[left]);
            left++;
        }
    }
    
    return maxLength;
}

题目三:合并两个有序数组

描述:给定两个有序整数数组 nums1nums2,将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。假定 nums1 有足够的空间来保存 nums2 中的元素。

示例

输入:
nums1 = [1, 2, 3, 0, 0, 0], m = 3
nums2 = [2, 5, 6], n = 3
输出:[1, 2, 2, 3, 5, 6]

技巧和思路

  • 双指针从后向前:因为 nums1 有足够的空间,可以从两个数组的末尾开始比较,将较大的元素放到 nums1 的末尾。这种方法避免了在数组中频繁插入元素,优化了时间复杂度。

代码实现

function merge(nums1, m, nums2, n) {
    let i = m - 1, j = n - 1, k = m + n - 1;
    while (i >= 0 && j >= 0) {
        if (nums1[i] > nums2[j]) {
            nums1[k--] = nums1[i--];
        } else {
            nums1[k--] = nums2[j--];
        }
    }
    while (j >= 0) {
        nums1[k--] = nums2[j--];
    }
}

题目四:寻找数组中的峰值

描述:峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值的索引即可。

示例

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

技巧和思路

  • 二分查找:利用二分查找的思想,通过比较中间元素与其左右相邻元素的大小,缩小查找范围。

代码实现

function findPeakElement(nums) {
    let left = 0, right = nums.length - 1;
    while (left < right) {
        let mid = Math.floor((left + right) / 2);
        if (nums[mid] > nums[mid + 1]) {
            right = mid;
        } else {
            left = mid + 1;
        }
    }
    return left;
}

标签:map,元素,nums,题解,complement,面经,算法,数组,nums1
From: https://blog.csdn.net/qq_41767061/article/details/139768258

相关文章

  • 吴恩达机器学习 第二课 week3 学习算法(模型)进阶
    目录01学习目标02导入计算所需模块03多项式回归模型进阶3.1数据集划分3.2 寻找最优解3.3 正则优化3.4增大数据量04神经网络模型进阶4.1数据准备4.2模型复杂度4.3正则优化05总结01学习目标   (1)掌握多项式回归模型的求解和优化   (2)掌握神......
  • 【408考点之数据结构】算法和算法评价(时间空间复杂度)
    算法和算法评价算法的基本概念在计算机科学中,算法是解决特定问题的一系列步骤。一个好的算法应该具备以下五个基本特性:有穷性:算法必须在有限的步骤内终止。确定性:每一步骤都必须明确,没有歧义。可行性:算法的每个步骤都可以通过基本运算在有限时间内完成。输入:一个算法有零......
  • 常见的排序算法——快速排序(四)
    本文记述了J.Bently和D.Mcllroy的快速三向切分快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想对比快速排序、快速排序(二)和快速排序(三)可以发现,对于随机数据而言,E.W.Dijkstra的三向切分快速排序的性能要慢于标准快速排序以及改进......
  • 机器学习算法 —— K近邻(KNN分类)
    ......
  • 决策树算法介绍:原理与案例实现
    一、引言在机器学习领域,决策树是一种常用且直观的分类和回归方法。它通过一系列简单的决策规则,将数据集分割成更小的子集,最终形成一个树状结构。本文将详细介绍决策树算法的原理,并通过具体案例实现来帮助读者更好地理解和应用这一算法。二、决策树原理1.决策树的基本概念......
  • LeetCode 算法: 环形链表 c++
    原题链接......
  • Adam优化算法
    Adam优化算法Adam(AdaptiveMomentEstimation)是一种用于训练深度学习模型的优化算法,由DiederikP.Kingma和JimmyBa在2014年提出。Adam结合了动量和自适应学习率的方法,具有高效、稳定和适应性强的特点,被广泛应用于各种深度学习任务中。Adam优化算法的基本思想Adam的核心思......
  • 多叉树的DFS深度优先遍历,回溯法的基础算法之一
    一、前言多叉树一般用于解决回溯问题。想必大家都学过二叉树,以及二叉树的深度优先遍历和广度优先遍历,我们思考:能不能将二叉树的DFS转化为多叉树的DFS?二、多叉树的结构多叉树的本质,就是一棵普通的树,比如下图:如果忽略将来的变化,那么,这棵树可以认为是一个未满的4叉树。......
  • (算法)找到字符串中所有字母异位词——<滑动窗⼝+哈希表>
    1.题⽬链接:438.找到字符串中所有字⺟异位词2.题⽬描述:3.解法(滑动窗⼝+哈希表): 算法思路:◦因为字符串p的异位词的⻓度⼀定与字符串p的⻓度相同,所以我们可以在字符串s中构造⼀个⻓度为与字符串p的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量; ◦当窗......
  • 进行一个字符串算法的总结
    本文参考字符串基础byAlex_Wei。Manacher算法这玩意是用来求回文子串的。虽然一个字符串的子串数量是\(O(n^2)\)级别的,但是回文串有更好的描述方式。注意到若一个子串\([l,r]\)是以\(mid\)为回文中心的回文串,那么将左端点和右端点朝着\(mid\)方向挪动若干单位也......