一、删除排序链表中的重复元素 II
- 题目:
- 题解:
- 方法一(遍历):
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode* dummy = new ListNode(0, head);
ListNode* cur = dummy;
while (cur->next && cur->next->next) {
if (cur->next->val == cur->next->next->val) {
int x = cur->next->val;
while (cur->next && cur->next->val == x) {
cur->next = cur->next->next;
}
}
else {
cur = cur->next;
}
}
return dummy->next;
}
};
- 方法二(双指针):
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* newHead = new ListNode(-101);
newHead->next = head;
ListNode* prev = newHead;
ListNode* curNode = head;
int x = 0;
while(curNode && curNode->next){
if(curNode->val == curNode->next->val){
x = curNode->val;
while(curNode && curNode->val == x){ //删除所有链表值为x的结点
prev->next = curNode->next;
curNode = curNode->next;
}
}
else{
prev = curNode;
curNode = curNode->next;
}
}
return newHead->next;
}
};
二、寻找峰值
- 题目:
- 题解:
- 方法一(调用api):
return max_element(nums.begin(),nums.end())-nums.begin();
- 方法二(二分法):
public:
int findPeakElement(vector<int>& nums) {
int n=nums.size();
int left=0,right = n-1;
if (n == 1) return 0;
// 先单独看下两个端点的情况:
if (nums[0] > nums[1]) return 0;
if (nums[n-1] > nums[n-2]) return n-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1]){
return mid;
}
if(nums[mid]<nums[mid-1]){
right=mid;
}else if(nums[mid]>nums[mid-1]){
left=mid;
}
}
return 0;
}
- 方法三(贪心):
int findPeakElement(vector<int>& nums) {
int n=nums.size();
int left=0,right = n-1;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<nums[mid+1]){
left=mid+1;
}else{
right=mid;
}
}
return left;
}
三、寻找旋转排序数组中的最小值
-
题目:
-
题解:
-
方法一(调用api(sort)):略
-
方法二(暴力):
int findMin(vector<int>& nums) {
int n=nums.size();
int index=0;
while(nums[0]>nums[n-index-1]){
index++;
}
for(int i=0;i<index;i++){
int temp=nums[n-1];
for(int j=n-1;j>0;j--){
nums[j]=nums[j-1];
}
nums[0]=temp;
}
return nums[0];
}
- 方法三(二分):
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size() - 1;
while (low < high) {
int pivot = low + (high - low) / 2;
if (nums[pivot] < nums[high]) {
high = pivot;
}
else {
low = pivot + 1;
}
}
return nums[low];
}
四、搜索二维矩阵
-
题目:
-
题解:
-
方法一(二分):
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int left=0,right=matrix[0].size()-1;
int m=matrix.size(),n=matrix[0].size();
int index=0;
for(int i=0;i<m;i++){
if(matrix[i][0]<=target&&matrix[i][n-1]>=target){
index=i;
break;
}
index++;
if(index>=m) return false;
}
while (left<=right){
int mid=left+(right-left)/2;
if(matrix[index][mid]==target) return true;
else if(matrix[index][mid]>target){
right=mid-1;
}else if(matrix[index][mid]<target){
left=mid+1;
}
}
return false;
}
};