⚡每日算法&面试题⚡一起肥学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命令)