array专题4

674 Longest Continuous Increasing Subsequence

问题:比较简单,直接看代码。问题是速度更快的代码是什么样子?
代码

665 Non-decreasing Array

思路:非降序数组,能有一次修改的机会。那就是查找 array[i+1]<array[i]array[i+1]<array[i], 整个数组中出现了两次或更多,就返回false。否则返回true。
问题:当只有一处错误的时候也要考虑下,能修改吗?修改后能称为非降数组吗?例如[4,2,3] ,idx=0的时候,nums[idx+1]<nums[idx]nums[idx+1]<nums[idx],这个时候,修改idx+1,就不能达到目的(因为nums[idx+1]>=4nums[idx+1]<=3nums[idx+1]>=4并且nums[idx+1]<=3是做不到的)。而修改nums[idx]就可以达到目的(nus[i]<=2nus[i]<=2即可)。但是例如[3,4,2,3] ,当idx=1的时候nums[idx+1]<nums[idx]nums[idx+1]<nums[idx],这个时候修改nums[idx+1],要求的范围是[4,3],没有数据;修改nums[idx],要求的范围是[3,2]还是没有数据。所以不能满足要求。
进一步分析:[4,2,3] ,idx=0的时候,nums[idx+1]<nums[idx]nums[idx+1]<nums[idx],这个时候应该修改nums[idx]=nums[idx+1]=2。因为nums[idx+1]越大,对后面形成非降数组越不利。
[3,4,2,3] ,当idx=1的时候nums[idx+1]<nums[idx]nums[idx+1]<nums[idx],因为nums[idx-1]>nums[idx+1],所以就不能修改nums[idx],只能修改nums[idx+1]=nums[idx]=4。在后面的判断,会继续出现第二次错误,最终返回false。
代码

661 Image Smoother

思路:这种查找二维数组周围的题目,一定要用到数组new int[]{-1,0,1}。
代码

189 Rotate Array

思路:For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].首先我的思路是循环队列,一次移动一个位置,移动k次:分别为[7,1,2,3,4,5,6] [6,7,1,2,3,4,5] [5,6,7,1,2,3,4],接着查找规律一次移动k个,需要借助长度为k的数组。
学习:题目要求O(1)的额外空间完成。学习到了倒转的思路。倒转数组。例如a= [1,2,3,4,5,6,7],首选倒转整个数组得到[7,6,5,4,3,2,1];接着倒转0到k-1前半部分数组得到[5,6,7,4,3,2,1];最后倒转k到末尾数组得到:[5,6,7,1,2,3,4]。为什么有效,没有找到答案。
代码

219 Contains Duplicate II

思路:把每个值对应的下标存起来,遇到相同的比较一下是不是最多相差k
学习:另外一种思路是,当前判断nums[i],那集合中只保留i-k,i-k+1,…i-1范围内的nums值,其他值去掉
代码

268 Missing Number

思路一:可以计算0,1,2,…n的和,然后再减去数组中的值,留下的就是丢失的数据。
思路二:将nums数组排序,二分查找的left值就是丢失的数据。
思路三:将0,1,2,…n异或的值与nums数组中每个值异或,最后的结果就是丢失的数据。

66 Plus One

思路:从低位开始加,如果不发生进位,则加法结束。如果发生进位,则前进到前一位做加1操作。最后判断,如果digits[0]=0则说明存在进位,需要扩展数组。
学习:思路跟上面差不多。不同之处是:加法结束直接返回;如果所有位数遍历完,还没有返回,则说明是 999+1,则需要扩展数组,将首位修改为1。这样速度更快。
代码

283 Move Zeroes

思路:idx记录不等于0的数组的存放下标,从左向右遍历。之后把idx到n之间的值填充为0。

532 K-diff Pairs in an Array

思路:每处理一个nums[i],需要判断j从i+1到n的数组值,是否符合|nums[i]-nums[j]|=k。去重部分使用set。例如nums[i]=2,k=3,则需要找到数值5,-1。当需要处理nums[i]=5的时候,因为2已经匹配过了,所以需要找到数值8。

public int findPairs(int[] nums, int k) {if (k < 0)return 0;int count = 0;Set<Integer> set = new HashSet<Integer>();// 存放已经计算过的数值for (int i = 0; i < nums.length; i++) {if (!set.contains(nums[i])) {Set<Integer> list = new HashSet<Integer>();if (!set.contains(nums[i] - k)) {list.add(nums[i] - k);}if (!set.contains(nums[i] + k)) {list.add(nums[i] + k);}for (int j = i + 1; j < nums.length && !list.isEmpty(); j++) {if (list.contains(nums[j])) {count++;list.remove((Integer) (nums[j]));}}set.add(nums[i]);}}return count;}

思路二:处理数组。首先因为需要去重,那就把数组排序,并且去掉重复的数据。还是依据上述的思路,只是不再考虑去重。这里要注意的是当k=0的时候,需要知道有多少数据重复。

public int findPairsV2(int[] nums, int k) {if (k < 0)return 0;Arrays.sort(nums);int idx = 0;// 新的长度int sameMatcherCount = 0;for (int i = 0; i < nums.length; i++) {nums[idx++] = nums[i];if (i + 1 < nums.length && nums[i + 1] == nums[i]) {sameMatcherCount++;}while (i + 1 < nums.length && nums[i + 1] == nums[i]) {i++;}}if (k == 0)return sameMatcherCount;int newLength = idx;int count = 0;for (int i = 0; i < newLength; i++) {for (int j = i + 1; j < newLength; j++) {if (Math.abs(nums[i] - nums[j]) == k) {count++;}}}return count;}

学习到的:统计每个数值出现次数。在处理某个数值n的时候,判断map的key值中是否存在n+k。时间复杂度降到了O(n)。

public int findPairsV3(int[] nums, int k) {if (nums == null || nums.length == 0 || k < 0)return 0;Map<Integer, Integer> map = new HashMap<>();int count = 0;for (int num : nums) {map.put(num, map.get(num) != null ? map.get(num) + 1 : 1);}for (Map.Entry<Integer, Integer> entry : map.entrySet()) {if (k == 0) {if (entry.getValue() >= 2) {count++;}} else {// 只判断entry.getKey()+k,避免重复if (map.keySet().contains(entry.getKey() + k)) {count++;}}}return count;}

代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础入门stm32需要学这些东西

1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。 如果你手上拥有ST官方主推的STM32神舟系列的板子&#xff0c;那么光盘都会配好这些文档&#xff0c;ST…

【数据结构与算法】字符串匹配 AC自动机

单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法多模式串匹配算法 Trie 树和 AC 自动机 AC 自动机 AC 自动机实际上就是在 Trie 树之上&#xff0c;加了类似 KMP 的 next 数组&#xff0c;只不过此处的 next 数组是构建在树上罢了。 AC 自动机的构建 将多个模式串构建成…

第六十一期:中国农民花3000块,发明史上最牛输入法!曾火遍中国20年

投递人 itwriter “王旁青头戋(兼)五一&#xff0c;土十二干士寸雨” 如果你还能熟练的背出这段口诀&#xff0c;恭喜你&#xff0c;又暴露年龄了。 倒回到十几年前&#xff0c;在刀哥被老师带到穿鞋套才能进神秘的机房&#xff0c;练习打字的时候&#xff0c;会五笔的人简直是…

数学归纳法证明Nicomachus's Theorem

今天看了《计算机程序设计艺术卷1》的部分内容。也希望更深入了解一下数学归纳法。所以将网页基本算重新写了一遍&#xff0c;写下证明过程。 理论Theorem 1311312335233533791133791143131517194313151719… 总的来说&#xff1a; ∀n∈N>0,n3∑ni1(n2−n2∗i−1)(n2−n…

第六十二期:腾讯云发布“小程序·云开发十大优秀实践”:猫眼、唯品会等入选

作者&#xff1a;周小白 【TechWeb】10 月 19 日消息&#xff0c;今日&#xff0c;腾讯云首次对外公布了“小程序云开发十大优秀实践”&#xff0c;包括白鹭引擎、千墨科技、腾讯新闻、即速应用、微盟、唯品会、猫眼、香格里拉、微信读书、微信支付等&#xff0c;涉及多个行业。…

[Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

【问题描述】[中等] 【解答思路】 用哈希表/数组存储每个数字对应的所有可能的字母&#xff0c;然后进行回溯操作。 回溯过程中维护一个字符串&#xff0c;表示已有的字母排列&#xff08;如果未遍历完电话号码的所有数字&#xff0c;则已有的字母排列是不完整的&#xff09;…

(68)zabbix windows性能计数器使用详解

概述 windows下的性能计数器让zabbix监控更加轻松&#xff0c;直接获取性能计数器的数值即可完成windows监控。性能计数器如下&#xff1a; 1perf_counter["\Processor(0)\Interrupts/sec"]或 1perf_counter["\Processor(0)\Interrupts/sec", 10]获取所有性…

欧几里得算法以及推论

欧几里得算法euclids algorithm 欧几里得算法又称辗转相除法&#xff0c;用于计算两个正整数a、b的最大公约数(greatest common divisor)。计算公式gcd(a,b) gcd(b, a%b)。用于RSA加密。 证明过程&#xff1a;参见 欧几里得算法扩展 给定两个正整数a、b&#xff0c;在计算…

第六十三期:微软与阿里云合作推出“开放应用模型(OAM)”

投递人 itseeker 英文原文&#xff1a;Announcing the Open Application Model (OAM) 原文标题&#xff1a;微软与阿里云合作推出“开放应用模型&#xff08;OAM&#xff09;” 用于 Kubernetes 及更多平台的应用开发、运行的开放标准 Kubernetes 已经成为业界领先的容器编排环…

Java基础课程---将一个字符串反转,将字符串中指定部分进行反转,比如,abcdefg, 反转为abfedcg...

1 将一个字符串反转&#xff0c;将字符串中指定部分进行反转&#xff0c;比如&#xff0c;"abcdefg", 反转为"abfedcg" 方式一 public class StringDemo {// 方式一 转为 char[]public String reverse(String str,int startIndex,int endIndex){if(str !n…

【数据结构与算法】【算法思想】贪心算法

贪心算法 回溯算法 分治算法 动态规划 四种基本的算法思想&#xff1a;贪心算法&#xff0c;分治算法&#xff0c;回溯算法&#xff0c;动态规划&#xff0c;他们不是具体算法&#xff0c;常用来指导我们设计具体的算法和编码等。 一&#xff1a;贪心算法有很多经典应用 霍夫…

第六十四期:微软将不再把 .NET Framework API 移植到 .NET Core 3.0

投递人 itwriter 目前 .NET Core 3.0 拥有的 API 总数约为 .NET Framework API 的 80%&#xff0c;剩下尚未从 .NET Framework 移植到 .NET Core 的 API&#xff0c;微软考虑以开源的形式发布。 微软方面表示&#xff0c;通过 .NET Core 3.0&#xff0c;他们现在已具备轻松移植…

array专题5

#561 Array Partition I# 思路&#xff1a;题目要求数组中所有数字配对后&#xff0c;每一对中最小值加和sum&#xff0c;sum要尽可能大。我的第一反应就是暴力枚举。下标为0的数值可能匹配的下标有&#xff1a;1,2,3…n-1&#xff1b;接着计算下标为1的数值可能匹配的下标有哪…

第六十五期:IBM净利润下降38%,旧时代巨头如何自救?

投递人 itwriter 图片来自“123RF” 10 月 17 日&#xff0c;IBM 发布 2019 年第三季度财报&#xff0c;数据显示&#xff0c;其营收为 180.28 亿美元&#xff0c;同比下降 3.9%&#xff0c;其利润为 16.72 亿美元&#xff0c;同比下降约 38%。我们看到 IBM 的营收和利润都呈现…

【数据结构与算法】【算法思想】分治算法

贪心算法 回溯算法 分治算法 动态规划 MapReduce本质就是分治算法&#xff0c;是Google大数据处理的三驾马车之一&#xff0c;另外两个是GFS和Bigtable。它在倒排索引&#xff0c;PageRank计算&#xff0c;网页分析等搜索引擎相关的技术中都有大量的应用。 MapReduce 框架只是…

arry-718 Maximum Length of Repeated Subarray

题目&#xff1a;Input: A: [1,2,3,2,1] B: [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum length is [3, 2, 1]. 思路&#xff1a;要找到两个数组中重复数据最长的子数组的长度。暴力枚举&#xff1a;每个A的下标i&#xff0c;分别与B的每个下…

第六十六期:软件架构之道的一次感悟

张泰峰 6月3日 写在前面 2019悄悄溜走一半&#xff0c;无论是离别的忧愁&#xff0c;还是成长路途的艰辛&#xff0c;都在心中滚烫。 距离上一篇文章已经很久了... 懒惰的博主不能将这一切归结于我的时间、我的规划、我的工作&#xff0c;只能怪自己懒......正所谓学如逆水行…

[Leetcode][第332题][JAVA][重新安排行程][欧拉回路 / 欧拉通路][优先队列][DFS]

【问题描述】[中等] 【解答思路】 递归 复杂度 class Solution {Map<String, PriorityQueue<String>> map new HashMap<String, PriorityQueue<String>>();List<String> itinerary new LinkedList<String>();public List<String&g…

不会配置HTTPS?给我5分钟,手把手教你

本文针对不会配置HTTPS或者小白开发着&#xff0c;请大佬们自动忽略。非广告&#xff0c;心得分享&#xff0c;勿喷&#xff0c;谢谢。 正文开始 01、关于 FreeSSL.cnFreeSSL.cn 是一个免费提供 HTTPS 证书申请、HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站&#xff0c;旨在…

第三十三期:使用wireshark抓包分析-抓包实用技巧

杰哥很忙 7月9日 前言 本文整理一下日常抓包使用的一些方法及抓包分析的一些方法。 本文基于wireshark2.2.6版本进行抓包处理。其他版本使用方式大同小异。 自定义捕获条件 wireshark可以将抓包数据保存到硬盘上。若需要长时间抓包的话&#xff0c;需要防止内存过大&#x…