⚡每日算法&面试题⚡一起肥学5️⃣

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡每日算法&面试题⚡一起肥学5️⃣相关的知识,希望对你有一定的参考价值。

算法题

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]
提示:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

一点点思路

这道题好像和昨天的事配套的,昨天介绍了常见的搜索算法今天就不说了。今天我们依旧使用二分查找法,如果你没有思路或者想要看看我怎么实现的可以往下面看看。

源码和题解

// 寻找左侧边界
    private int left_bound(int [] nums, int target) {

        int low = 0, high = nums.length - 1;
        while (low <= high) {

            int mid = low + (high - low) / 2;
            if (nums[mid] < target) {

                low = mid + 1;
            } else if (nums[mid] > target) {

                high = mid - 1;
            } else {

                high = mid - 1;
            }
        }

  // 最后要检查 left 越界的情况
        if (low >= nums.length || nums[low] != target) return -1;
        return low;
    }
 // 寻找右侧边界
    private int right_bound(int [] nums, int target) {

        int low = 0, high = nums.length - 1;
        while (low <= high) {

            int mid = low + (high - low) / 2;
            if (nums[mid] < target) {

                low = mid + 1;
            } else if (nums[mid] > target) {

                high = mid - 1;
            } else {

                low = mid + 1;
            }
        }
// 最后要检查 right 越界的情况
        if (high < 0 || nums[high] != target) return -1;
        return high;
    }
 public int[] searchRange(int[] nums, int target) {

        int[] res = new int[] {-1,-1};
        if (nums.length == 0 || nums == null) return res;

        res[0] = left_bound(nums, target);
        res[1] = right_bound(nums, target);
        return res;
    }

面试题

哈希表原理和考点

  • 为什么会使用哈希表:在Java的另外两种类似的数据结构数组和链表中,要么是易于快读,不便‘存’ ‘删’要么正好一反。哈希表的出现正好解决了可以快速读取和存储的特点。Java里面两种hash表。hashmap和hashset我在之前讲过,大家可以翻一翻聊天记录呀。

  • 详细介绍:哈希表中有一个哈希函数(散列函数)。即构建一个确定的映射,它能把关键字映射到一个唯一的存储位置。这种映射应该是我们可以进行计算的。已知关键字,我们应该能算出其地址;反之,已知地址,我们可以检索到对应的关键字。一旦建立起这种关系,那么给定关键字,我就能直接利用这个映射(即所谓的哈希函数)直接算出其地址并寻址。这可大大缩减确定关键字存储位置所花的时间。

  • 常见考点无非就是怎么解决哈希冲突,灵活的解决问题还有掌握基本原理。

  • 下面我们着重说一下怎么解决哈希冲突:1·开散列法(Open Hashing)。是指哈希表所基于的数组中,每个位置是一个 Linked List 的头结点。这样冲突的 <key,value> 二元组,就都放在同一个链表中。2·闭散列法(Closed Hashing)是指在发生冲突的时候,后来的元素,往下一个位置去找空位

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

另外我现在也在准备计算机基础知识四件套(计算机网络,计算机组成原理,计算机操作系统,数据结构)了,后面会一起发的到时候一起肥学呀。

以上是关于⚡每日算法&面试题⚡一起肥学5️⃣的主要内容,如果未能解决你的问题,请参考以下文章

⚡每日算法&面试题⚡一起肥学1️⃣1️⃣(面试linux命令)

⚡每日算法&面试题⚡一起肥学6️⃣

⚡每日算法&面试题⚡一起肥学1️⃣0️⃣( 含 HashMap& TreeMap)

⚡每日算法&面试题⚡一起肥学7️⃣

⚡每日算法&面试题⚡一起肥学4️⃣

⚡每日算法&面试题⚡一起肥学8️⃣