突出什么 加强网站建设,长春网站开发senluowx,树荫营销网站,网建短信一、寻找右区间(二分法)
题意#xff1a;题目很容易理解 但是转换为二分法有点晦涩
给你一个区间数组 intervals #xff0c;其中 intervals[i] [starti, endi] #xff0c;且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j #xff0c;并满足 startj e…一、寻找右区间(二分法)
题意题目很容易理解 但是转换为二分法有点晦涩
给你一个区间数组 intervals 其中 intervals[i] [starti, endi] 且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j 并满足 startj endi 且 startj 最小化 。注意 i 可能等于 j 。
让我们去找一个区间的最小右侧区间满足条件右侧区间的start值该区间的end值可能存在多个右侧区间取最小的start值的区间。并把该区间的下标放到数组里面返回。没有记作-
思路
题目要让我们去找一个区间的最小右侧区间。如何做到最小
1.首先将每个区间的start值进行排序
2.然后for循环遍历每一个区间将其end值作为target。
3.然后二分查找第一个target的start值的下标。放到res数组中
4.返回res数组
代码
//将每一个区间的左端点排序 遍历每一个数组的右端点 找到第一个比它大的左端点 然后加入到集合中。如何将左端点排序使用二维数组
class Solution {public int[] findRightInterval(int[][] intervals) {//第一步 创建sortStart数组 并且排序int[][] sortStartnew int[intervals.length][2];//start值下标for(int i0;iintervals.length;i){sortStart[i]new int[]{intervals[i][0],i};}Arrays.sort(sortStart,(a,b)-a[0]-b[0]);//第二步 遍历每一个区间的end 并且将其作为targetint[] resnew int[intervals.length];for(int i0;iintervals.length;i){int targetintervals[i][1];//第i个区间的end值int left0,rightsortStart.length-1;//第三步 二分查找最小的end的start值的下标 放入res数组中while(leftright){int midleft(right-left)/2;if(sortStart[mid][0]target){rightmid;}else{leftmid1;}}res[i]sortStart[left][0]intervals[i][1]?sortStart[left][1]:-1;}return res;}
}
二、最长递增子序列dp二分法
解法一dp动态规划
dp五部曲
1.dp[i]的含义:以i为结尾的最长递增子序列的长度
2.递推公式dp[i]Math.max(dp[i],dp[j]1);在0-i如果找到比nums[i]小的数说明找到了一个递增序列然后对dp[i]进行更新。
3.初始化dp[i]1;
4.遍历的顺序:双层for循环i从1开始j从0开始直ji;
代码
class Solution {public int lengthOfLIS(int[] nums) {//1.dp[i]:以i结尾的最长递增子序列的长度int[] dpnew int[nums.length];Arrays.fill(dp,1);int max1;for(int i1;inums.length;i){for(int j0;ji;j){if(nums[j]nums[i]){dp[i]Math.max(dp[i],dp[j]1);}}maxMath.max(max,dp[i]);}return max;}
}
解法二辅助数组二分法
思路
遍历数组如果遇到的数字是大于尾部元素的直接放到尾部元素后面使得递增序列变大
如果遇到的数字是小于尾部元素的为了使递增的速度最慢就要将该元素放到最合适的地方.
那么这个最合适的地方如何去寻找 当然我们可以利用辅助数组单调递增的规律使用二分查找法去寻找最合适的地方。
代码:
class Solution {public int lengthOfLIS(int[] nums) {//1.定义辅助数组int[] sortNumsnew int[nums.length];int size1;sortNums[0]nums[0];for(int i0;inums.length;i){//如果大于的话 直接放到sortNums的后边if(nums[i]sortNums[size-1]){sortNums[size]nums[i];}else{//如果小于的话 我们就要去找合适的位置int targetnums[i];int left0,rightsize-1;while(leftright){int midleft(right-left)/2;if(sortNums[mid]target){rightmid-1;}else{leftmid1;}}sortNums[right1]nums[i];}}return size;}
}
三、寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums找到峰值元素并返回其索引。数组可能包含多个峰值在这种情况下返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] nums[n] -∞ 。
因为nums[-1]nums[n]-∞因此可以推断出:
nums[i]nums[i1]:那么后面一定存在一个峰值
nums[i]nums[i1];那么前面一定存在一个峰值
思路
那么就根据推断出的规律来进行二分查找如果nums[mid]nums[mid1] leftmid1;
nums[mid]nums[mid1] rightmid;
代码
class Solution {public int findPeakElement(int[] nums) {if(nums.length1)return 0;int left0,rightnums.length-1;while(leftright){int midleft(right-left)/2;if(nums[mid]nums[mid1]){rightmid;}else{leftmid1;}}return left;}
}
四、找到k个最接近的元素
题意
给定一个 排序好 的数组 arr 两个整数 k 和 x 从数组中找到最靠近 x两数之差最小的 k 个数。返回的结果必须要是按升序排好的。
输入arr [1,2,3,4,5], x 3, k 4
输出[1,2,3,4] 相同距离的话 加入较小的解法一双指针删除法
思路
逆向思维在数组中删除(size-k)个离x最远的数字。可以使用双指针leftright向x靠近的同时不断删除元素。
比如在1 2 3 4 5中寻找4个最靠近3的数。
left指向1,right指向5。和3的距离都为2将5删除。剩余四个数字 4k。那么加入到集合中返回。
代码
class Solution {public ListInteger findClosestElements(int[] arr, int k, int x) {// 双指针删除法ListInteger res new ArrayList();int number arr.length;int left 0;int right number - 1;int count 0;while (left right) {if (count number - k) {for (int i left; i right; i) {res.add(arr[i]);}}int diff1 Math.abs(x - arr[left]);int diff2 Math.abs(arr[right] - x);if (diff1 diff2)right--;elseleft;count;// 已经删除的数字}return res;}
}
五、俄罗斯套娃问题(最长上升子序列的二维版)
你一个二维整数数组 envelopes 其中 envelopes[i] [wi, hi] 表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候这个信封就可以放进另一个信封里如同俄罗斯套娃一样。
解法一动态规划(超时)
解法二贪心二分查找
思路
当只有宽和高都比上一个信封大的时候才能实现套娃。
我们可以先对宽度进行升序排列确认了宽度之后就变成一维的求最长上升子序列了。
如何求最大长度的高度序列。使用贪心算法:每次我们都希望放在末尾的值是一个符合条件并且尽可能小的数字这样我们的长度最长的概率就最大。(因此当我们遇到heights[i]tails[size]的时候我们需要将heights[i]放到合适的位置但是heights所对应宽度是可能相等的。在相等的时候我们应该按照降序排列这样在更新下一个的时候就会把它刷掉)。
举个例子理解一下假如按照升序排列后为:(5,5),(6,6),(7,2)(7,1)(8,3),(9,4)。
1.envelopes[i][1]5, 集合为空tails[0]5 size1;
2.envelopes[i][1]6, 6大于5tails[1]6,size2;
3.envelopes[i][1]2, 2小于6给2寻找合适的位置,25。因此tails[0]2;
4.envelopes[i][1]1, 1小于6给1寻找合适的位置,12,因此tails[0]1;
5.envelopes[i][1]33小于6给3寻找合适的位置,36,因此tails[1]3
6.envelopes[i][1]44大于3因此tails[2]4size3
寻找合适的位置是根据二分搜索法进行寻找。
代码
class Solution {public int maxEnvelopes(int[][] envelopes) {if(envelopes.length0)return 0;;// 对信封的宽度排序Arrays.sort(envelopes,new Comparatorint[](){public int compare(int[] a,int[] b){return a[0]b[0]?b[1]-a[1]:a[0]-b[0];}});int maxSize1;int size1;int[] tailsnew int[envelopes.length];tails[0]envelopes[0][1];for(int i1;ienvelopes.length;i){if(envelopes[i][1]tails[size-1]){tails[size]envelopes[i][1];}else{int left0,rightsize-1;int targetenvelopes[i][1];while(leftright){int midleft(right-left)/2;if(tails[mid]target)rightmid-1;else leftmid1;}tails[right1]target;}}return size;}
}
六、寻找旋转排序数组中的最小值(要求时间复杂度为O(logN))
思路二分法
旋转之前是一个升序数组旋转之后会变成两段升序数组。
旋转时小数往后走大数旋转到前面来。分情况
1.起始点在到达中间之前(右边部分一定处于升序),nums[mid]的值一定是小于nums[right]的此时起始点一定在mid左边(包括mid)
2.起始点到达中间之后大数占领起始点之前的区域,nums[mid]的值一定是大于nums[right]的此时起始点一定是在右半部分的。(反证一下如果起始点在左部分的话那么起始点的右边一定是升序的那么nums[mid]一定小于nums[right])
所以
1.当nums[mid]nums[right]起始点一定在右边,更新左边界leftmid1;
2.当nums[mid]nums[right],起始点一定在左边更新有边界rightmid;
代码
class Solution {public int findMin(int[] nums) {int sizenums.length;int left0,rightsize-1;while(leftright){int midleft(right-left)/2;if(nums[mid]nums[right]){rightmid;}else{leftmid1;}}return nums[left];}
}
七、搜索旋转排序数组
在传递给函数之前nums 在预先未知的某个下标 k0 k nums.length上进行了 旋转使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]下标 从 0 开始 计数。例如 [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target 如果 nums 中存在这个目标值 target 则返回它的下标否则返回 -1 。
思路
将一个排序好的数组旋转变成两段升序序列(也可能是一段 就是原始的)。然后找到元素的起始点。两种情况
1.如果起始点0说明并没有进行旋转还是原始的数组。
2.如果起始点0,说明进行了旋转在两段序列中进行查找target就可以。
代码:
class Solution {public int search(int[] nums, int target) {if (nums.length 1 nums[0] target)return 0;// 首先找到起始点 找到起始点之后 两段升序找targetint left 0, right nums.length - 1;while (left right) {int mid left (right - left) / 2;if (nums[mid] nums[right]) {// 说明mid一定在左半边right mid;} else {left mid 1;}}// left就是起始的位置int res1 0;int res2 0;if (left 0)return binarySearch(nums, 0, nums.length - 1, target);else {res1 binarySearch(nums, 0, left - 1, target);res2 binarySearch(nums, left, nums.length - 1, target);}return res1 -1 ? res2 : res1;}public int binarySearch(int[] nums, int left, int right, int target) {int index -1;while (left right) {int mid left (right - left) / 2;if (nums[mid] target) {right mid;} else if (nums[mid] target) {left mid 1;} else {return mid;}}return nums[left]target?left:index;}
}
八、搜索二维矩阵II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性
每行的元素从左到右升序排列。每列的元素从上到下升序排列。 思路
如果从左上角或者右下角开始寻找的话不具有区别度。
如果从右上角或者左下角寻找的话
1.右上角左边变小下边变大
2.左下角上边变小右边变大
代码
class Solution {public boolean searchMatrix(int[][] matrix, int target) {//从右上角出发int rolmatrix.length;int cowmatrix[0].length;int x0,ycow-1;while(xroly0){if(matrix[x][y]target){x;}else if(matrix[x][y]target){y--;}else{return true;}}return false;}
}
文章转载自: http://www.morning.nyplp.cn.gov.cn.nyplp.cn http://www.morning.rfwrn.cn.gov.cn.rfwrn.cn http://www.morning.prjty.cn.gov.cn.prjty.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.yfmwg.cn.gov.cn.yfmwg.cn http://www.morning.pthmn.cn.gov.cn.pthmn.cn http://www.morning.qrlkt.cn.gov.cn.qrlkt.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn http://www.morning.chfxz.cn.gov.cn.chfxz.cn http://www.morning.rxdsq.cn.gov.cn.rxdsq.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.qgmwt.cn.gov.cn.qgmwt.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.tnwwl.cn.gov.cn.tnwwl.cn http://www.morning.bcngs.cn.gov.cn.bcngs.cn http://www.morning.rmpfh.cn.gov.cn.rmpfh.cn http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.sgmgz.cn.gov.cn.sgmgz.cn http://www.morning.dzpnl.cn.gov.cn.dzpnl.cn http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn http://www.morning.xbckm.cn.gov.cn.xbckm.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.llgpk.cn.gov.cn.llgpk.cn http://www.morning.qnlbb.cn.gov.cn.qnlbb.cn http://www.morning.cwskn.cn.gov.cn.cwskn.cn http://www.morning.kksjr.cn.gov.cn.kksjr.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn http://www.morning.wnkbf.cn.gov.cn.wnkbf.cn http://www.morning.wkmpx.cn.gov.cn.wkmpx.cn http://www.morning.dcmnl.cn.gov.cn.dcmnl.cn http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn http://www.morning.yrmpz.cn.gov.cn.yrmpz.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.rwqk.cn.gov.cn.rwqk.cn http://www.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.rcdmp.cn.gov.cn.rcdmp.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.abgy8.com.gov.cn.abgy8.com http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.gypcr.cn.gov.cn.gypcr.cn http://www.morning.gfqjf.cn.gov.cn.gfqjf.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.tnnfy.cn.gov.cn.tnnfy.cn http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.rjnrf.cn.gov.cn.rjnrf.cn http://www.morning.ngqty.cn.gov.cn.ngqty.cn http://www.morning.hxxzp.cn.gov.cn.hxxzp.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.brcdf.cn.gov.cn.brcdf.cn http://www.morning.pbsfq.cn.gov.cn.pbsfq.cn http://www.morning.djmdk.cn.gov.cn.djmdk.cn http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn http://www.morning.rflcy.cn.gov.cn.rflcy.cn http://www.morning.pqqhl.cn.gov.cn.pqqhl.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.zkdmk.cn.gov.cn.zkdmk.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.kcyxs.cn.gov.cn.kcyxs.cn http://www.morning.rhqn.cn.gov.cn.rhqn.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.epeij.cn.gov.cn.epeij.cn http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.prddj.cn.gov.cn.prddj.cn