type
status
date
slug
summary
tags
category
icon
password

学习小结:

  • 二维坐标转为一维坐标详解见例题三
  • if语句是否有=的问题见例题二
  • 重复元素问题见例题四

例题一:

 

题目描述:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))

题解:

 

问题and重点

这个题目重点在于是不是可以想到怎么使用二分法,他也给提示了,时间复杂度是O(m+n),所以我们要考虑怎么构造这个左右端点才可以符合条件,刚开始我也没有想到是这样的做法,借鉴了一下ai,确实强
这个题目思路是:
首先,我们要知道,我们mid的值不能超过数组的长度,所以我们的右端点应该取较短的哪一个值
然后下面就是具体实现,以及确定边界,mid的值应该分成mid1,mid2,因为有两个数组,这里我们确定一个分割点,对于第二个数组的分割点我们直接用(m+n)//2-mid1,这样可以保证两边的范围大小是一样的,可以保证中位数的条件
接下来就是保证边界问题,如果到达了边界就要开始赋值了,我们要保证两个数组的左边界分别小于两个数组的右边界,这样就可以保证单调性了
 

例题二:

题目描述

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题

题解:

 

问题and重点

这个题目考点就是在二分查找时的if语句判断的是否加上=
拿第一个函数举例
notion image
 
就像是第一个,nums[mid]<target 所以如果有重复的情况,就像是
第一次到了第二个8,但是这时候满足了第二个条件,此时指针还会往左走,直到l指向第一个8

例题三:

题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:
  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 1:
notion image

题解:

 

问题and重点:

这个题的重点是如何将二维坐标转换为一维坐标,这个是本题最大的收获点

例题四:

题目描述:

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
 

题解:

 
关键问题:
此题的关键有两个:
一个是旋转数组的左右区分问题
一个是去重问题: 如果一个数nums[l]与nums[mid]与nums[r]都是一个值,就会导致指针不知道王座还是往右走
 

例题五:

题目描述:

已知一个长度为
的数组,预先按照升序排列,经由
旋转
后,得到输入数组。例如,原数组
在变化后可能得到:
  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]
  • 若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
你必须尽可能减少整个过程的操作步骤。
示例 1:
示例 2:
 

题解:

 
关键重点: 此题的关键就是找到规律可以找到左右边界,能够区分左右区间,还有就是可以找到去除重复元素的方法
 
 
安卓开发一—页面配置算法学习模板——链表、单调栈、单调队列、KMP
Loading...