• 【JULY-1】DAY 1 二分查找


    每日计划

    7/4/2022 MON

    • 704、二分查找
    • 35、搜索插入位置
    • 34、在排序数组中查找元素的第一个和最后一个位置
    • 69、x的平方根
    • 367、有效的完全平方数

     704、二分查找

    第一次提交结果:超出时间限制。

    1. int search(int* nums, int numsSize, int target){
    2. int left=0;
    3. int right=numsSize;
    4. while(left<right)
    5. {
    6. int middle=left+((right-left)/2);
    7. if(nums[middle]>target)
    8. {
    9. right=middle;
    10. }
    11. else if(nums[middle]<target)
    12. {
    13. left=middle;
    14. }
    15. else
    16. {
    17. return middle;
    18. }
    19. }
    20. return -1;
    21. }

    第二次提交结果:通过

    1. int search(int* nums, int numsSize, int target){
    2. int left=0;
    3. int right=numsSize-1;
    4. while(left<=right)
    5. {
    6. int middle=(left+right)/2;
    7. if(nums[middle]>target)
    8. {
    9. right=middle-1;
    10. }
    11. else if(nums[middle]<target)
    12. {
    13. left=middle+1;
    14. }
    15. else
    16. {
    17. return middle;
    18. }
    19. }
    20. return -1;

    错误原因:

    二分查找涉及边界条件。

    while(left<right) or while(left<=right),right=middle or right=middle-1。

    区间的定义就是不变量。

    写二分法,区间定义一般为两种,左闭右闭[left,right],左闭右开[left,right)。

    题中描述:

    1. n 将在 [1, 10000]之间。
    2. nums 的每个元素都将在 [-9999, 9999]之间。

    所以该二分查找应该采用左闭右闭的写法而不是第一次提交的左闭右开的写法。

    35、搜索插入位置 

    第一次提交结果:可以完成位置查找,无法完成插入。显示超出限制时间。

    1. int searchInsert(int* nums, int numsSize, int target){
    2. int left=0;
    3. int right=numsSize;
    4. while(left<right)
    5. {
    6. int middle=(right+left)/2;
    7. if(target==nums[middle])
    8. {
    9. return middle;
    10. }
    11. else
    12. {
    13. if(nums[middle]>target)
    14. {
    15. right=middle;
    16. }
    17. else if(nums[middle]<target)
    18. {
    19. left=middle;
    20. }
    21. }
    22. }
    23. int i;
    24. for(i=0;i<numsSize;i++)
    25. {
    26. if(nums[i]>target&&nums[numsSize-1]>target)
    27. {
    28. return i;
    29. }
    30. else if(nums[numsSize-1]<target)
    31. {
    32. return numsSize;
    33. }
    34. }
    35. return 0;
    36. }

    第二次提交结果:通过

    1. int searchInsert(int* nums, int numsSize, int target){
    2. int left=0;
    3. int right=numsSize-1;
    4. while(left<=right)
    5. {
    6. int middle=(left+right)/2;
    7. if(nums[middle]>target)
    8. {
    9. right=middle-1;
    10. }
    11. else if(nums[middle]<target)
    12. {
    13. left=middle+1;
    14. }
    15. else
    16. {
    17. return middle;
    18. }
    19. }
    20. return right+1;
    21. }

    原因:

    遇到有序无重复数组考虑二分法

    由于题目给的target是左闭右闭,所以应该使用 right=numsSize-1; while(left<=right); right=middle-1.

    若区间定义为左闭右开 则right=numsSize; while(left<right); right=middle.

    当数组中没有查找的数字时,直接返回一个数right+1就可以表示需要插入的位置,不需要繁琐地判断。

    34、 在排序数组中查找元素的第一个和最后一个位置

    1. int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    2. int* result=(int*)malloc(sizeof(int)*2);
    3. result[0]=-1;
    4. result[1]=-1;
    5. int left=0;
    6. int right=numsSize-1;
    7. while(left<=right)
    8. {
    9. int middle=(left+right)/2;
    10. if(nums[middle]>target)
    11. {
    12. right=middle-1;
    13. }
    14. else if(nums[middle]<target)
    15. {
    16. left=middle+1;
    17. }
    18. else//nums[middle]==target
    19. {
    20. left=middle;
    21. right=middle;
    22. while(left>0&&nums[left]==nums[left-1])
    23. {
    24. left--;
    25. }
    26. while(right<numsSize-1&&nums[right]==nums[right+1])
    27. {
    28. right++;
    29. }
    30. result[0]=left;
    31. result[1]=right;
    32. *returnSize=2;
    33. return result;
    34. }
    35. }
    36. return result;
    37. }

    69、x的平方根

    求算术平方根就是用这个数除一个数,看是不是等于这个数。分大小于情况可以二分法 

    1. int mySqrt(int x){
    2. if(x==0)
    3. return 0;
    4. int left=1,right=x;
    5. while(left<=right)
    6. {
    7. int mid=left+(right-left)/2;
    8. if(mid>x/mid)
    9. {
    10. right=mid-1;
    11. }
    12. else if(mid<x/mid)
    13. {
    14. left=mid+1;
    15. }
    16. else
    17. {
    18. return mid;
    19. }
    20. }
    21. return right;
    22. }

    367、有效的完全平方数

    1. /*错误。无法判断5是不是完全平方数*/
    2. bool isPerfectSquare(int num){
    3. int left=1;
    4. int right=num;
    5. while(left<=right)
    6. {
    7. int mid=left+(right-left)/2;
    8. if(mid>num/mid)
    9. {
    10. right=mid-1;
    11. }
    12. else if(mid<num/mid)
    13. {
    14. left=mid+1;
    15. }
    16. else
    17. {
    18. if(num%mid==0)
    19. return true;
    20. }
    21. }
    22. return false;
    23. }
    1. /*把返回true的放在前面就可以了,为什么*/
    2. bool isPerfectSquare(int num){
    3. int left=1;
    4. int right=num;
    5. while(left<=right)
    6. {
    7. int mid=left+(right-left)/2;
    8. if(num/mid==mid&&num%mid==0)
    9. {
    10. return true;
    11. }
    12. else if(mid>num/mid)
    13. {
    14. right=mid-1;
    15. }
    16. else
    17. {
    18. left=mid+1;
    19. }
    20. }
    21. return false;
    22. }

  • 相关阅读:
    找不到vcruntime140.dll,无法继续执行代码,vcruntime140.dll怎么修复
    MySQL 存储引擎
    Web Development with Python Step1
    Java项目:ssm企业人事管理系统
    miniblink学习
    分享78个Python源代码总有一个是你想要的
    python查找替换:查找空行,空行前后添加```,```中间添加 # + 空格 + 空行后遇到的第1行文字?
    java遇到的一些集合相关知识
    Spark SQL 与 Hive 的小文件调优
    【LeetCode刷题日志】225.用队列实现栈
  • 原文地址:https://blog.csdn.net/weixin_45485670/article/details/125598170