leetcode—522

    xiaoxiao2022-07-06  213

    1.删除排序数组中的重复项II

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改数组并在使用O(1)额外空间的条件下完成。

    思路:原地删除肯定是双指针,一个指向遍历的元素,一个指向可以写入的位置。考虑fast和current - 1位置的元素是否相等。

    int removeDuplicates(vector<int>& nums) { if(nums.size() < 3) { return nums.size(); } int slow = 1; for(int fast = 2; fast < nums.size(); fast++) { if(nums[fast] != nums[slow - 1]) { slow++; nums[slow] = nums[fast]; } } return slow + 1; }

    2.搜索旋转排序数组II

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回true,否则返回false。

    思路:二分查找

    bool search(vector<int>& nums, int target) { int start = 0; int end = nums.size() - 1; while(start <= end) { int mid = (start + end) / 2; if(nums[mid] == target) { return true; } if(nums[mid] > nums[start]) //start与mid之间的数字是有序的 { if(target >= nums[start] && target < nums[mid]) { end = mid - 1; } else { start = mid + 1; } } else if(nums[mid] < nums[end]) //mid与end之间的数字是有序的 { if(target > nums[mid] && target <= nums[end]) { start = mid + 1; } else { end = mid - 1; } } else if(nums[start] == nums[mid]) { start++; } else { end--; } } return false; }
    最新回复(0)