• 【LeetCode-面试经典150题-day24】


    目录

    35.搜索插入位置

     74.搜索二维矩阵

     162.寻找峰值

     33.搜索旋转排序数组


     

    35.搜索插入位置

    题意:

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    请必须使用时间复杂度为 O(log n) 的算法。

    【输入样例】nums = [1,3,5,6], target = 5

    【输出样例】2

    解题思路:最简单的二分查找,给定的是排序数组,直接根据数组下标,找到范围内的中点,并与target比较,如果比target大,则缩小查找范围为左区间;如果比target笑,缩小查找范围为右区间;如果相等,直接返回。

    1. class Solution {
    2. public int searchInsert(int[] nums, int target) {
    3. int l =0;
    4. int r = nums.length-1;
    5. while(l<=r){
    6. int mid = (l+r)/2;
    7. if(nums[mid] == target){
    8. return mid;
    9. }else if(nums[mid]
    10. l=mid+1;
    11. }else if(nums[mid]>target){
    12. r=mid-1;
    13. }
    14. }
    15. return l;
    16. }
    17. }

    时间: 击败了100.00%

    内存: 击败了82.77%

     74.搜索二维矩阵

    题意:

    给你一个满足下述两条属性的 m x n 整数矩阵:

    • 每行中的整数从左到右按非递减顺序排列。
    • 每行的第一个整数大于前一行的最后一个整数。

    给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

    【输入样例】matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3

    【输出样例】true

    解题思路:原理与上一题一样,不过这里变成了二维矩阵。按照题目的要求,可以把二维矩阵看成一维数组,直接用上一题的方法,要注意的是下标之间的转换;

    矩阵有m行n列,则在一维矩阵中,中间索引为mid,对应二维矩阵中的坐标为:

    i = mid / n;//一行多少个数,能有多少整行

    j = mid % n; //剩下当前行中有多少列

    1. class Solution {
    2. public boolean searchMatrix(int[][] matrix, int target) {
    3. int m = matrix.length;
    4. int n = matrix[0].length;
    5. int low = 0, high = m * n - 1;
    6. while(low <= high){
    7. //这里有个坑,就是二维数组跟一维数组还不太一样,这里直接除之后还需要加上low
    8. //加上low的特殊原因是保证mid可以代表其在一维数组中的真实坐标
    9. int mid = (high - low) / 2 + low;
    10. int x = matrix[mid/n][mid % n];
    11. if(x < target){
    12. low = mid + 1;
    13. }else if(x > target){
    14. high = mid - 1;
    15. }else{
    16. return true;
    17. }
    18. }
    19. return false;
    20. }
    21. }

    时间: 击败了100.00%

    内存: 击败了95.25%

     162.寻找峰值

    题意:

    峰值元素是指其值严格大于左右相邻值的元素。

    给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

    你可以假设 nums[-1] = nums[n] = -∞ 。

    你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

    【输入样例】nums = [1,2,3,1]

    【输出样例】2

    解题思路:寻找最大值。

    1. class Solution {
    2. public int findPeakElement(int[] nums) {
    3. int n = nums.length;
    4. int max = 0;
    5. for(int i=1;i
    6. if(nums[i] > nums[max]){
    7. max = i;
    8. }
    9. }
    10. return max;
    11. }
    12. }

    时间: 击败了100.00%

    内存: 击败了95.66%

     33.搜索旋转排序数组

    题意:

    整数数组 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,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

    给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

    你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

    【输入样例】nums = [4,5,6,7,0,1,2], target = 0

    【输出样例】4

    解题思路:先二分查找找到mid,如果left

    对于[mid,right]也是如此,如果mid

    1. class Solution {
    2. public int search(int[] nums, int target) {
    3. int low = 0,high = nums.length - 1;
    4. while(low <= high){
    5. int mid = (low + high) /2;
    6. if(nums[mid] == target) return mid;
    7. if(nums[low] <= nums[mid]){
    8. if (target >= nums[low] && target < nums[mid]){
    9. high = mid - 1;
    10. }else{
    11. low = mid + 1;
    12. }
    13. }else{
    14. if (target > nums[mid] && target <= nums[high]){
    15. low = mid + 1;
    16. } else{
    17. high = mid - 1;
    18. }
    19. }
    20. }
    21. return -1;
    22. }
    23. }

    时间: 击败了100.00%

    内存: 击败了80.30%

  • 相关阅读:
    383.赎金信
    Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台
    参数估计法在逻辑斯谛回归的应用
    什么是固话号码认证?固话号码认证有用吗?
    社区医疗系统平台的设计与实现
    带你认识JDK8中超nice的Native Memory Tracking
    C++ 编写动态二维double型数据类Matrix
    读 RocketMQ 源码,学习并发编程三大神器
    Python学习三(面向对象)
    nodejs:path路径模块
  • 原文地址:https://blog.csdn.net/qq_37998848/article/details/132921961