704.二分查找
(1)文章讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-NIOFdyTlsoiEaMxrhh2cvzVnneh
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-NIOFdyTlsoiEaMxrhh2cvzVnneh
(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-ItpDdyqwxoZv80xbSqucW53znch
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-ItpDdyqwxoZv80xbSqucW53znch
(3)题目描述:
(4)开始想法:
1.先想到的是不用二分查找的直接查找
#include<iostream>
#define N 10000
using namespace std;
int findnumber(int a[N],int n,int m)
{
int find=0,i;
for(i=0;i<m;i++)
{
if(a[i]==n)
{
find=1;
break;
}
}
if(find==1) return i;
else{
return -1;
}
}
int main()
{
int a[N]={1,2,3,4,5,6},n=6;
int target;
cin>>target;
cout<<findnumber(a,target,n)<<endl;
return 0;
}
(5)解题思路:
1.左闭右闭
#include<iostream>
#define N 10000
using namespace std;
int findnumber(int a[N],int n,int m)
{
int left=0,right=n-1;
while(left<=right)//可以相等,左闭右闭值都可取到
{
int middle=(left+right)/2;
if(a[middle]<m) left=middle+1;//m是要查找的数别忘了
else if(a[middle]>m) right=middle-1;
else return middle;//返回下标
}
return -1;
}
int main()
{
int a[N]={1,2,3,4,5,6},n=6,target;
cin>>target;
cout<<findnumber(a,n,target)<<endl;
return 0;
}
2.左闭右开
#include<iostream>
#define N 10000
using namespace std;
int findnumber(int a[N],int n,int m)
{
int left=0,right=n;//右边取不到n,相当于下标是从n-1开始
while(left<right)//左闭右开严格小于
{
int middle=(left+right)/2;
if(a[middle]<m) left=middle+1;
else if(a[middle]>m) right=middle;//变为middle了因为右边取不到了
else return middle;//返回下标
}
return -1;
}
int main()
{
int a[N]={1,2,3,4,5,6},n=6,target;
cin>>target;
cout<<findnumber(a,n,target)<<endl;
return 0;
}
(6)总结:
1.二分查找两种方法,不管哪种都是左闭,不同情况下注意一下right的变化就行
准备:双指针法
27.移除元素
(1)文章讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OlCedlLtpocnNFxPQmsc888Gndg
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OlCedlLtpocnNFxPQmsc888Gndg
(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OUG4dgkngotmrlxnWwJcHOXfnMh
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OUG4dgkngotmrlxnWwJcHOXfnMh
(3)题目描述:
(4)开始想法:
1.想像逢7跳过一样用continue,然后定义一个count若遍历的时候数不为val那count++,最后输出(好然后发现根本不是这样写的,太棒了!!!)
(5)解题思路:
1.一个覆盖了val后元素顺序(下标)发生了更改,在原数组中进行动态变化形成新数组的过程
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int slow= 0; // 就是指在存第一个元素的位置
for (int fast= 0; fast<nums.size(); fast++)
{
if (nums[fast] != val)
{
nums[slow++] = nums[fast]; // 将当前元素复制到慢指针的位置
}
}
return slow; // 返回慢指针的位置,即新数组的长度
}
}c;//定义一个Solution类型的变量
int main()
{
vector<int> nums = {3, 2, 2, 3};
int val = 3;
int newsize= c.removeElement(nums, val);//调用类里面的公开函数
cout<<newsize<<endl;
for (int i = 0; i < newsize; i++)
{
cout<<nums[i]<<" ";
}
cout<<endl;
return 0;
}
(6)总结:
1.(快指针用来获取新数组中的元素,慢指针用来更新其在新数组中的位置)快指针获取到的值赋给慢指针就行,快指针指向(不等于要查找的val)元素,这样的元素是新数组中需要的
2.用vector容器是因为需要一个大小在运行过程时可以动态变化的数组,vector 会自动管理内存,允许动态扩展和收缩
3.&引用允许函数直接修改传入的 vector 对象。这意味着函数内部对 vector 所做的任何修改都会反映到原始数据上
4.形参中引用
977.有序数组的平方
(1)文章讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-DxegdTeKto6UxcxybUccAGoenge
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-DxegdTeKto6UxcxybUccAGoenge
(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-IjEudpa5VoV1zBxu0DMcF8fknxr
https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-IjEudpa5VoV1zBxu0DMcF8fknxr
(3)题目描述:
(4)开始想法:
1.拿到一个升序排列的数组(当然这个数组里会有负数)负数平方后会变大,就不是非递减了,要重新排序
(5)解题思路:
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
vector<int> sortedSquares(vector<int>& num) {
int k = num.size() - 1;//数组长度减一,最后一个元素的下标
vector<int> result(num.size(), 0);
//双指针
for (int i = 0, j = num.size() - 1; i <= j;)// 注意这里要i <= j,因为最后要处理两个元素
{
if (num[i] * num[i] < num[j] * num[j])
{
result[k--] = num[j] * num[j];
j--;
}
else
{
result[k--] = num[i] * num[i];
i++;
}
}
return result;
}
};
int main()
{
Solution nums;
vector<int> num = {-4, -1, 0, 3, 10};
vector<int> result = nums.sortedSquares(num);
cout << "Sorted squares: ";
for (int num : result)
{
cout << num << " ";
}
cout << endl;
return 0;
}