2.24代码随想录第一天打卡

准备:数组理论基础文章链接https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-DyCFdIiOdo40guxrnJ8cmPZmnschttps://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-DyCFdIiOdo40guxrnJ8cmPZmnsc

704.二分查找

(1)文章讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-NIOFdyTlsoiEaMxrhh2cvzVnnehhttps://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-NIOFdyTlsoiEaMxrhh2cvzVnneh

(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-ItpDdyqwxoZv80xbSqucW53znchhttps://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-OlCedlLtpocnNFxPQmsc888Gndghttps://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OlCedlLtpocnNFxPQmsc888Gndg

(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-OUG4dgkngotmrlxnWwJcHOXfnMhhttps://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-DxegdTeKto6UxcxybUccAGoengehttps://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-DxegdTeKto6UxcxybUccAGoenge

(2)视频讲解:https://px3yjb20qam.feishu.cn/docx/FKvEdyuakob0VexfDUkc4PAknlf?from=tab_shared_subfolder#share-IjEudpa5VoV1zBxu0DMcF8fknxrhttps://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;
}

(6)总结:

1.又是用双指针(想不到_^_^_)
2.由原数组的两头往里取,(平方后)由最大到次大,判断两头元素平方后谁的值更大

3.像上面这个因25>9新数组中最后先存入25,所以i先++移向1,j不动,移向1后1<9再将9存入新数组中j--往前移(所以for中不写i++,j--因为还要根据情况)
4.vector<int> result(num.size(), 0);  :创建一个大小与输入数组   num   相同的   result   数组,并初始化所有元素为0。这确保了   result   数组有足够的空间来存储所有的平方值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值