数组
文章平均质量分 62
剑指Offer-LeetCode数组动态规划类面试高频题
Java大数据运动猿
努力提升自己,记录学习过程。巩固自己,帮助他人!
展开
-
215. 数组中的第K个最大元素【382】
此题基于快速排序进行改编,来求解目标元素。快速排序的原理是找一个基准值,然后把小于基准值的所有元素放在左边,大于基准值的所有元素放在右边,然后再用递归的方式分别对左右两边的元素进行快速排序。在此题中,因为找的是第k个最大的元素,所以目标值的索引位置为array.length-k,所以每排一次序之后,判断基准值的索引位置是否小于目标值的索引位置,小于的话则对右边的元素进行排序,否则对左边的元素进行排序,依次类推,当基准值的索引位置等于目标值的索引位置时,将其位置对应的值返回即可。这样的原创 2023-03-14 13:46:56 · 221 阅读 · 0 评论 -
88. 合并两个有序数组【184】
利用双指针的方法,nums1 和 nums2 数组各设置一个指针,从头往后遍历,然后将nums1 和 nums2 数组中的元素按照规则依次放入sorted数组中,最后将sorted数组中的元素赋值给nums1即可。把nums1 和 nums2 数组中的元素按规则放入 sorted 数组中,用4个判断句。当 p1==m 时,说明nums1数组遍历完成当 p2==n 时,说明nums2数组遍历完成要么就是p1 和 p2 都没遍历结束,那就比较nums1 和 nums2 中的值就行。原创 2022-12-28 14:34:52 · 323 阅读 · 0 评论 -
121. 买卖股票的最佳时机【190】
先设两个变量,一个记录历史最低价格minprice,一个记录最大利润maxprofit;然后在for循环里进行赋值,两个判断句,一个是比较出最小价格然后赋值,另一个是找出最大利润然后赋值。待循环结束后,也就相当于遍历了一遍,最小价格也找到了,最大利润也算好了。原创 2022-12-27 14:09:26 · 299 阅读 · 0 评论 -
1. 两数之和【212】
利用hash表的快速查找功能,每次往hash表中添加一个键值对时,先判断hash表中是否有target - num[i],有的话就相当于数组中包含了两个数相加等于target,那么就返回这两个数值在数组中的下标位置;如果没有则将 num[i] 添加到hash表中。原创 2022-12-27 13:38:43 · 302 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字【14】
题目叫我们找出任意一个重复元素即可,这里我们可以利用Set集合“不允许有重复元素”的特性来解题。先逐一遍历数组,将数组元素一个一个放入容器中,当容器中包含了此元素时,就找到了重复元素,此时return此元素即可。如果一直没有重复元素,最后return -1,因为数组元素取值是0~n-1,所以不会有-1。原创 2022-09-25 11:17:00 · 148 阅读 · 0 评论 -
剑指 Offer04. 二维数组中的查找【27】
很明显,由于该二维数组上到下递增,左到右递增的特殊性,遍历整个矩阵进行查找不是该题目的意图所在。总结规律我们可以发现:应该从矩阵的右上角或者左下角开始查找。 (1)以右上角为例,首先选取右上角的数字,如果该数字等于要查找的数字,则查找过程结束; (2)如果该数字大于要查找的数字,则说明该列其他元素都大于要查找的数字,便可以删掉该列; (3)如果该数字小于要查找的数字,则说明该行其他元素也都小于要查找的数字,便可以删掉该行。 这样,每一次比较都可以剔除一行或者一列,缩小范围原创 2022-09-26 19:58:38 · 276 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数【2】
分两步:1.将数字异或,任何一个数字异或它自己都等于0,而0异或任何数都等于那个数。2.把数组分成两个子数组,使每个子数组包含一个只出现一次的数字,而其他数字成对出现原创 2022-10-18 15:44:25 · 177 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字【5】
利用二分查找+递归思想首先数组0-n-1中数值是有序的,只有其中一个数不在数组中,设它为m,则m之前的数值与下标都是相等的,m之后的数值都比下标大1,即m+1、m+2......二分法求解(1)中间元素值等于下标元素,则目标对象在后半部分(2)中间元素值不等于下标元素,则目标对象在前半部分接着不断二分下去,直到找到元素。原创 2022-10-09 16:26:26 · 133 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I【18】
二分查找法 target:目标值1.如果中间数字比target大,那target只能出现在数组的前半段2.如果中间数字比target小,那target只能出现在数组的后半段3.如果中间数字等于target,那就寻找左右两边target的值,左右两边同时遍历数组,直到找到目标元素,指针停止。原创 2022-10-09 14:37:12 · 147 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数【17】
1.先将整型数组转为字符串数组(防止数字过大溢出)2.再用快速排序、递归的思想,定一个pivot基准值,分出left、right两个区域,递归不断分下去,将左右两块区域的元素移动,最终另左边任意元素与pivot组合都小于pivot在前,右边任意元素与pivot组合都大于pivot在前。原创 2022-10-09 10:30:44 · 195 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【30】
一开始看到这道题的时候,我有两个思路,一个是从头到尾遍历一遍,像冒泡排序似的(冒泡排序算法),前后两个元素(前偶数后奇数)交换位置。后面考虑了一下时间复杂度,想着这样肯定不行。后面又想到了和题解思路类似的思路,类似于快速排序(快速排序算法),就是数组前后各设置一个指针,然后进行交换。大致思路是想通了,但是一些实现细节还是有点差别。原创 2022-09-28 11:26:38 · 663 阅读 · 2 评论 -
剑指 Offer 11. 旋转数组的最小数字【17】
1、如果 mid 指向的元素大于 right 指向的元素,也就意味着异常点肯定是发生在 [ mid + 1 , right ] 这个区间的,不需要再在 [ left ,mid ] 这个区间里面查找,那么可以更新 left 的位置为 mid + 1。2、如果 mid 指向的元素小于 right 指向的元素,也就意味着 [ mid , right ] 这个区间中所有的元素都是正常递增,不需要再在 [ mid , right ] 这个区间里面查找,异常点发生在 [ left , mid ] 这个区间,那么可以更原创 2022-09-27 16:57:06 · 761 阅读 · 2 评论 -
53. 最大子数组和【235】== 剑指 Offer 42. 连续子数组的最大和【31】
dp[ i ]=max(dp[ i-1]+data[ i ],data[ i ]). 这个公式的含义是:当以第i-1个数字结尾的子数组中所有数字的和小于0时,把这个负数与第i个数累加,则得到的和比第i个数字本身还要小,所以这种情况下dp[ i ]就是第i个数字本身。反之,如果以第i-1个数字结尾的子数组中所有数字的和大于0,则与第i个数字累加就得到以第i个数字结尾的子数组中所有数字的和。原创 2022-10-05 15:56:12 · 514 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵【22】
由于是按照从外到内的顺序依次打印,所以可以把矩阵想象成若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一圈。而对于每一圈的打印,很自然便可以想到遵循从左到右,从上到下,从右到左,从下到上的顺序。但是这里需要注意的是最后一圈的打印,由于矩阵并不一定是方阵,最后一圈有可能退化为只有一行,只有一列,甚至只有一个数,因此要注意进行判断,避免重复打印。原创 2022-09-30 08:26:04 · 393 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字【19】
根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。因此,我们可以在遍历数组的时候设置两个值:一个是数组中的数result,另一个是出现次数times。当遍历到下一个数字的时候,如果与result相同,则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1。这样,当遍历结束后,最后一次设置的result的值就是符合要求的值。原创 2022-10-04 12:35:08 · 702 阅读 · 2 评论