力扣45跳跃游戏 II
题目描述:
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
与另一个(力扣55)十分相似,最短的跳跃距离,依旧是贪心,只要让位置跳的尽量远即可
真就贪心,想不到那就做不出来,无语,这种题目是真没意思,不过得注意不像上一题只要维护最大值,现在还要维护最大步长
12345678910111213141516171819//代码如下 public int jump(int[] nums) { if (nums.length == 1) return 0; int max = 0;//当前步长能走的最大值,也即下次的步长 int step = 1;//当前步数 int s ...
力扣55跳跃游戏
题目描述:
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
经典跳跃小游戏,简单的dp缓存表最好想了
1234567891011121314151617181920212223//代码如下 //缓存表 //dp2是和下面优化的代码有所区分无意义,int类型是因为存三个状态:能到,不能到,未缓存 int[] dp2; public boolean canJump(int[] nums) { dp2 = new int[nums.length]; return f(nums, 0); } public boolean f(int[] nums, int index) { //basecase if (index > nums.length - 1) return false; if (dp2[index] != ...
力扣189 轮转数组
题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
题目非常简单,分成两段数组分别赋值即可,不过注意是检查的依旧是原数组
123456789101112//代码如下 public void rotate(int[] nums, int k) { int[] temp = Arrays.copyOf(nums, nums.length); k = k % nums.length;//超过一圈后都是循环 for (int i = 0; i < nums.length - k; i++) { nums[i + k] = temp[i]; } for (int i = nums.length - k; i < nums.length; i++) { nums[i - nums.length + k] = temp[i]; } }
空间复杂度优 ...
力扣169 合并两个有序数组
题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目非常简单,让我们找出现次数最多的数,使用Hash表应该是最好想到的,不多赘述。
12345678910111213//代码如下 public int majorityElement(int[] nums) { if (nums.length <= 2) return nums[0];//特殊情况,直接返回 HashMap<Integer, Integer> map = new HashMap<>(16); for (int i = 0; i < nums.length; i++) { if (!map.containsKey(nums[i])) map.put(nums[i], 1);//不存在创建添加 else { ...
力扣80 删除有序数组中的重复项 II
题目描述:
给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
与leetcode26优化后的结果差不多:
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前应该去重的数据数量来确定当前数据如果不重复应该移动的位置,不过题目要求是重复两次以上,所以额外再加一个变量记录重复次数。
这样分析会有三种情况
当前数据位置与索引位置相等:重复次数+1
且数据重复次数大于两次:则应该去重的数量+1
否则少于两次应该保留:即需要移动数据
当前数据位置与索引位置不相等:重复次数重置为1,保留(移动)数据
注意的是:移动数据的目的就是为了保留此数据,因为后面的数据不参与答案校验
1234567891011121314151617181920//代码如下 public int removeDuplicates(int[] nums) { ...
力扣26 合并两个有序数组
题目描述:
给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
创建一个新数组遍历去重就不多说啦
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前重复的数据数量来确定当前数据如果不重复应该移动的位置,比如重复了两个数,那么这个位置未重复的数应该前移两个
注意的是:
记录的是当前重复的数据数所以返回时应该用总数减去
123456789//代码如下 public int removeDuplicates(int[] nums) { int count = 0;//重复的数据数 for (i ...
力扣27 移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
简单题,不多赘述;(去创建一个数组遍历我想大家都会)
不过由于nums的大小不重要,我们会想到能不能在原数组进行操作?这里可以通过记录非val的数据的数量来进行优化
注意的是:
count为当前非val的数据数量
赋值操作不会覆盖未比较的值(因为count永远比当前索引小)
12345678//代码如下 public int removeElement(int[] nums, int val) { int count = 0; for (int num : nums) if (num != val) ...
力扣88 合并两个有序数组
题目描述:
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
经典的双指针问题,可以分别从左往右遍历两个数组来按顺序merge
简单题,不多赘述
注意的是:
由于校验的是nums1指针指向的数组(不是传统的返回数据校验)
所以我们需要修改的是原指针指向的数组,开头去创建一个对象复制原数组用做中间量,原数组当作结果容器。
12345678910111213141516171819202122//代码如下 public void merge(int[] nums1, int m, int[] nums2, int n) { //nums1是一个指针,对其 ...
常见打字错误拼音记录
打字网站推荐
这个网站不错(免费的还可以自己加文章),大家有空可以来测试一下打字速度!
https://dazi.91xjr.com/?e57bd12b463dbaaf965fbbe68280069c
前后鼻音
馨 xin | 温馨 wen xin
新 xin 欣 xin 心 xin 信 xin 辛 xin
星 xing 兴 xing 杏 xing
品 pin 聘 pin 拼 pin 频 pin 贫 pin
平 | 评 萍 坪 苹 | ping 屏 ping 凭 ping 瓶 ping
今 jin 金 jin 尽 jin 进 jin
竟 jing 经 jing
音 yin 吟 yin 因 yin 银 yin 阴 | 荫 yin
应 ying 英 ying 赢 ying 影 ying 荧 ying
亲 qin 秦 qin 琴qin
青 | 请 清 晴 情 | qing 轻 qing 庆 qing 氢 qing 卿 qing
林 | 淋 琳 霖 | lin | 粦 | 麟 鳞 磷 粼 | lin 临 lin 邻 lin
令 ...
马丁·路德·金《我有一个梦想》演讲稿(中英文双版)
马丁路德金的演讲稿《我有一个梦想》(中英文双版)
《我有一个梦想》是1960年代的美国黑人民权运动领袖马丁·路德·金博士一场极为著名演讲的名称,由于他在该次演说中,强力且有说服力地描述他对于黑人与白人有一天能和平且平等共存的远景时,不断重复使用的“I have a dream”一词。演讲在1963年8月28日华盛顿大游行中,于林肯纪念堂前发表。该演讲促使美国国会在1964年通过《1964年民权法案》宣布所有种族隔离和歧视政策为非法政策。
中文版全文:
我有一个梦想
100年前,一位伟大的美国人签署了解放黑奴宣言,今天我们就是在他的雕像前集会。这一庄严宣言犹如灯塔的光芒,给千百万在那摧残生命的不义之火中受煎熬的黑奴带来了希望。它之到来犹如欢乐的黎明,结束了束缚黑人的漫漫长夜。然而100年后的今天,我们必须正视黑人还没有得到自由这一悲惨的事实。100年后的今天,在种族隔离的镣铐和种族歧视的枷锁下,黑人的生活备受压榨。100年后的今天,黑人仍生活在物质充裕的海洋中一个穷困的孤岛上。100年后的今天,黑人仍然萎缩在美国社会的角落里,并且意识到自己是故土家园中的流亡者。今天我们在这里集会,就是要 ...