一、学习新题
1、合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//为两个数组分别设置一个指针p1与p2来作为队列的头部指针
int p1=0,p2=0;
//排序好的数组的长度是原来两个数组的长度之和
int sorted[m+n];
//
int cur;
//在指针下标不超过数组长度的前提下
while(p1<m||p2<n)
{
//如果指针1和数组nums1中的m下标相等
//也就是说,数组1中的元素都小于数组2中的元素
if(p1==m){
//就把数组nums2中下标为指针2的位置后移,并将这个位置的值赋值给cur
cur=nums2[p2++];
}
//如果指针2和数组nums2中的n下标相等
//也就是说,数组2中的元素都大于数组1中的元素
else if(p2==n){
//就把数组nums1中下标为指针1的位置后移,并将这个位置的值赋值给cur
cur=nums1[p1++];
}
//如果数组1下标为p1对应的数小于数组2下标为p2对应的数
else if(nums1[p1]<nums2[p2]){
//就把较小的数赋值给cur
cur=nums1[p1++];
}else{
//最后,如果以上情况均不满足,就将数组2中下标为指针2的位置后移,并将这个位置的值赋给cur
cur=nums2[p2++];
}
sorted[p1+p2-1]=cur;
}
for(int i=0;i!=m+n;i++){
nums1[i]=sorted[i];
}
}
};
二、复习旧题
1、删除链表中的重复元素
给定一个已排序的链表的头节点 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr){
return head;
}
ListNode* temp=head;
while(temp->next){
if(temp->val==temp->next->val){
temp->next=temp->next->next;
}else
{
temp=temp->next;
}
}
return head;
}
};
2、x的平方根
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
class Solution {
public:
int mySqrt(int x) {
int left=0,right=x,ans=0;
while(left<=right){
int mid=left+(right-left)/2;
if((long long)mid*mid<=x){
ans=mid;
left=mid+1;
}else{
right=mid-1;
}
}
return ans;
}
};