【每日力扣】2007. 从双倍数组中还原原数组 与3. 无重复字符的最长子串

news/2024/9/23 11:55:50/

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害

2007. 从双倍数组中还原原数组

一个整数数组 original 可以转变成一个 双倍 数组 changed ,转变方式为将 original 中每个元素 值乘以 2 加入数组中,然后将所有元素 随机打乱

给你一个数组 changed ,如果 change双倍 数组,那么请你返回 original数组,否则请返回空数组。original 的元素可以以 任意 顺序返回。

示例 1:

输入:changed = [1,3,4,2,6,8]
输出:[1,3,4]
解释:一个可能的 original 数组为 [1,3,4] :
- 将 1 乘以 2 ,得到 1 * 2 = 2 。
- 将 3 乘以 2 ,得到 3 * 2 = 6 。
- 将 4 乘以 2 ,得到 4 * 2 = 8 。
其他可能的原数组方案为 [4,3,1] 或者 [3,1,4] 。

解题思路

首先把 changed\textit{changed}changed 排序,并且统计所有元素出现的频数。

然后我们从小到大依次遍历数组,如果对于一个元素,它的频数大于零,并且它的两倍数也还在数组中,我们则可以把它加入到答案中。

如果对于一个数找不到它两倍数,即两倍数的频数等于零,则说明无法找到原数组,返回空数组即可。

代码实现

class Solution {public int[] findOriginalArray(int[] changed) {Arrays.sort(changed);Map<Integer, Integer> count = new HashMap<>();for (int a : changed) {count.put(a, count.getOrDefault(a, 0) + 1);}int[] res = new int[changed.length / 2];int i = 0;for (int a : changed) {if (count.get(a) == 0) {continue;}count.put(a, count.get(a) - 1);if (count.getOrDefault(a * 2, 0) == 0) {return new int[0];}count.put(a * 2, count.get(a * 2) - 1);res[i++] = a;}return res;}
}

3. 无重复字符的最长子串

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

示例 1:

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

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路

  1. 初始化一个 HashMap 用于存储字符和字符的最新出现的位置。HashMap 的 key 存储字符,value 存储字符下标。
  2. 使用双指针 leftright 表示当前子串的左右边界,left 表示窗口的起始位置,right 是窗口的结束位置。
  3. 遍历整个字符串,对于字符串中的每个字符:
    • 如果字符已经在 HashMap 中,更新 left 指针的位置为该字符在 HashMap 中出现的位置加 1。
    • 更新该字符在 HashMap 中的位置为当前的位置。
    • 计算当前窗口的长度 right - left + 1 并更新最大长度 max
  4. 最终返回最大长度 max 即为最长的不含重复字符的子串长度。

代码实现

import java.util.HashMap;class Solution {public int lengthOfLongestSubstring(String s) {if (s.length() == 0) return 0;HashMap<Character, Integer> map = new HashMap<>();int max = 0;int left = 0;for (int right = 0; right < s.length(); right++) {if (map.containsKey(s.charAt(right))) {left = Math.max(left, map.get(s.charAt(right)) + 1);}map.put(s.charAt(right), right);max = Math.max(max, right - left + 1);}return max;}
}

http://www.ppmy.cn/news/1433905.html

相关文章

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…

基于arcpro3.0.2版的使用深度学习检测对象之椰子树

基于arcpro3.0.2版的使用深度学习检测对象之椰子树 GPU显卡Nivda 1080 训练模型图 (四)检测对象之椰子树 使用深度学习检测对象 打开 detect objects using deep learning,参数 输入栅格为要检测的影像 模型定位为上一步输出的.emd文件 cpu模式Max Overlap Ratio0.4 运行时间…

CSS基础:outline轮廓4个属性的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

考研党打印资料怎么使用云打印服务?

对于准备考研的同学们来说&#xff0c;在备考的时候需要准备许多资料&#xff0c;这些资料的打印费用成为了考研党的巨额支出。那么在生活费有限的情况下&#xff0c;考研党打印资料最好是选择云打印服务&#xff0c;因为易绘创云打印服务低至5分钱/页还包邮。那么考研党打印资…

# 设计模式 #5.6 Memento备忘录,行为型模式

在您提供的备忘录模式的笔记中&#xff0c;已经很好地概述了该模式的主要概念和参与者。为了进一步优化这些笔记&#xff0c;我们可以确保术语的一致性&#xff0c;并清晰地定义每个组件的作用。以下是优化后的笔记内容&#xff1a; 备忘录模式&#xff08;Memento Pattern&am…

指针(5)

前言 本节是有关指针内容的最后一节&#xff0c;本节的内容以讲解指针习题为主&#xff0c;那么就让我们一起来开启本节的学习吧&#xff01; sizeof和strlen的对比 1.sizeof 我们在学习操作符的时候&#xff0c;学习了sizeof。sizeof存在的意义是用来计算变量所占用的内存空…

查看linux的主机配置脚本

废话不说 直接上指令 curl -Lso- bench.sh | bash 等待后&#xff0c;结果如图&#xff1a; 使用后没有问题&#xff0c;看情况使用 出事概不负责 介意勿用&#xff01;&#xff01;&#xff01;