• Leetcode (ok)167 11 (思路) 35 74 (*) 162 33 34 153


    35. Search Insert Position(再做只需要想如何取区间)

    1. class Solution {
    2. public:
    3. int searchInsert(vector<int>& nums, int target) {
    4. int left = 0, right = nums.size();
    5. while(left < right){
    6. int mid = left + (right-left)/2;
    7. if(nums[mid] == target) return mid;
    8. else if(nums[mid] > target) right = mid;
    9. else left = mid+1;
    10. }
    11. return right;
    12. }
    13. };

    最重要的还是如何取区间

    当right = nums.size(), 表示为左闭右开,此时终止循环时,left = right

    74. Search a 2D Matrix(只需要想到思路)

    1. class Solution {
    2. private:
    3. int get(vectorint>> matrix, int index){
    4. int m = matrix.size(), n = matrix[0].size();
    5. //纵坐标
    6. int i = index/n;
    7. //横坐标
    8. int j = index%n;
    9. return matrix[i][j];
    10. }
    11. public:
    12. bool searchMatrix(vectorint>>& matrix, int target) {
    13. int m = matrix.size(), n = matrix[0].size();//m是竖列,n是横列
    14. int left = 0, right = m*n-1;
    15. while(left <= right){
    16. int mid = left + (right-left)/2;
    17. if(get(matrix, mid) > target) right = mid-1;
    18. else if(get(matrix, mid) < target) left = mid+1;
    19. else return true;
    20. }
    21. return false;
    22. }
    23. };

    把二维的转换成一维的

    162. Find Peak Element(*)

    1. class Solution {
    2. public:
    3. int findPeakElement(vector<int>& nums) {
    4. int left = 0, right = nums.size()-1;
    5. while(left < right){
    6. int mid = left + (right-left)/2;
    7. if(nums[mid] > nums[mid+1]){
    8. right = mid;
    9. }else{
    10. left = mid+1;
    11. }
    12. }
    13. return right;
    14. }
    15. };

    33. Search in Rotated Sorted Array(*)

    1. class Solution {
    2. public:
    3. int search(vector<int>& nums, int target) {
    4. int left = 0, right = nums.size()-1;
    5. while(left <= right){
    6. int mid = left + (right-left)/2;
    7. if(nums[mid] == target) return mid;
    8. else if(nums[mid] >= nums[left]){
    9. //说明在断崖的左边,这里不要忘记等于
    10. if(target >= nums[left] && target < nums[mid]){
    11. right = mid-1;
    12. }else{
    13. left = mid+1;
    14. }
    15. }else{
    16. if(target > nums[mid] && target <= nums[right]){
    17. left = mid+1;
    18. }else{
    19. right = mid - 1;
    20. }
    21. }
    22. }
    23. return -1;
    24. }
    25. };

    先确定断崖和mid的关系, 在找有序的部分

    34. Find First and Last Position of Element in Sorted Array(*)

    1. class Solution {
    2. private:
    3. int left_bound(vector<int>& nums, int target){
    4. int left = 0, right = nums.size()-1;
    5. while(left <= right){
    6. int mid = left + (right-left)/2;
    7. if(nums[mid] > target){
    8. right = mid-1;
    9. }else if(nums[mid] < target){
    10. left = mid+1;
    11. }else{
    12. right = mid -1;
    13. }
    14. }
    15. if(left >= nums.size()) return -1;
    16. return nums[left] == target ? left: -1;
    17. }
    18. int right_bound(vector<int>& nums, int target){
    19. int left = 0, right = nums.size()-1;
    20. while(left <= right){
    21. int mid = left + (right-left)/2;
    22. if(nums[mid] > target){
    23. right = mid-1;
    24. }else if(nums[mid] < target){
    25. left = mid+1;
    26. }else{
    27. left = mid +1;
    28. }
    29. }
    30. if(right < 0) return -1;
    31. return nums[right] == target ? right: -1;
    32. }
    33. public:
    34. vector<int> searchRange(vector<int>& nums, int target) {
    35. int lIndex = left_bound(nums, target);
    36. int rIndex = right_bound(nums, target);
    37. return {lIndex, rIndex};
    38. }
    39. };

    153. Find Minimum in Rotated Sorted Array

    1. class Solution {
    2. public:
    3. int findMin(vector<int>& nums) {
    4. if(nums.size() == 1) return nums[0];
    5. int left = 0, right = nums.size()-1;
    6. if(nums[left] < nums[right]) return nums[left];
    7. while(left <= right){
    8. int mid = left+(right-left)/2;
    9. if(nums[mid+1] < nums[mid]) return nums[mid+1];
    10. if(nums[mid-1] > nums[mid]) return nums[mid];
    11. if(nums[mid] > nums[0]){
    12. left = mid+1;
    13. }else{
    14. right = mid-1;
    15. }
    16. }
    17. return -1;
    18. }
    19. };

    167. Two Sum II - Input Array Is Sorted(OK)

    1. lass Solution {
    2. public:
    3. vector<int> twoSum(vector<int>& numbers, int target) {
    4. int left = 0, right = numbers.size()-1;
    5. while(left < right){
    6. int sum = numbers[left] + numbers[right];
    7. if(sum > target) right--;
    8. else if(sum < target) left++;
    9. else return {left+1, right+1};
    10. }
    11. return {-1, -1};
    12. }
    13. };

    11. Container With Most Water(ok)

    1. class Solution {
    2. public:
    3. int maxArea(vector<int>& height) {
    4. int res = 0;
    5. int left = 0, right = height.size()-1;
    6. while(left < right){
    7. int cur_area = min(height[left], height[right]) * (right-left);
    8. res = max(res, cur_area);
    9. if(height[left] < height[right]) left++;
    10. else right--;
    11. }
    12. return res;
    13. }
    14. };

  • 相关阅读:
    软件明明通过了各种级别的测试,交付给用户仍会出现问题?
    与创新者同行!Apache Doris 首届线下峰会即将开启,最新议程公开!|即刻预约
    利用Flutter的特性最大程度提升iOS应用的用户体验
    选择排序(超详细)
    连接池-归还连接详解(上)
    Django--admin 后台管理站点
    突破瓶颈:如何应对高级职位的面试
    基于rt-thread studio的STM32裸机开发第一节:点亮一个LED
    Oracle共享内存不释放
    java基于微信小程序的校园二手闲置商品交易系统 uniapp 小程序
  • 原文地址:https://blog.csdn.net/Zoeyii/article/details/132892151