代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

明确自己刷题的目的
1.华为可信考试
2.继续打打基础不要忘
3.保持各个语法、算法的敏感度:主要针对python、c、cpp,有时间也可以看看go

今日学习的文章链接和视频链接

数组理论基础

题目建议: 了解一下数组基础,以及数组的内存空间地址,数组也没那么简单。

704. 二分查找

在这里插入图片描述

还未看题解的思路:二分法凭感觉写

cpp版跟c语言版本差不多,语法上在指针上略有差别int right = numsSize-1;

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0,right = nums.size()-1;
        while(right-left>=0){
            int mid = (right+left)/2;
            if(nums[mid] == target){
                return mid;
        }else if(target>nums[mid]){
            left = mid+1;
        }else if(target<nums[mid]){
            right = mid-1;
        }
        } 
        return -1;
    }
};

题目链接
文章讲解
视频讲解

看完题解的关注点:

1.二分法的前提:

数组为有序数组
数组中无重复元素
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
再写一个python版,对于防溢出这里还有一点疑问:mid = left +(right-left)//2,为什么这样就防溢出了,while(right-left>=0)while left<=right有本质区别吗?时间太晚了明天在写

class Solution(object):
    def search(self, nums, target):
        left,right = 0,len(nums)-1
        
        while left<=right:
            mid = left +(right-left)//2
            if nums[mid]<target:
                left = mid+1
            elif nums[mid]>target:
                right = mid-1
            else 
                return mid
        return -1
  1. 移除元素

题目链接
文章讲解

● 自己看到题目的第一想法,报错了

试试暴力:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for (int i = 0; i < size; i++){
            if (val == nums[i]){
                for (int j = i+1;j < size; j++){
                    nums[j-1] = nums[j];
                } 
                i--;
                size--;
            }
        }
        return size;
    }
};

● 看完代码随想录之后的想法

暴力解决:思路一致
双指针法:关键在于理解双指针分别的含义
快指针寻找新数组的元素,即不包含val的数组
慢指针指向新数组的地址位置

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

● 自己实现过程中遇到哪些困难
暴力解法的时候思路不够清晰,第二个for循环应该更清晰

for (int j = i+1;j < size; j++){
                    nums[j-1] = nums[j];
                } 

双指针需要多多复习

● 今日收获,记录一下自己的学习时长
第二道题还没有很扎实的思考一遍,但时间不够了
9点开始10点半结束1.5h,今天时间不是很充足,明天看看还有没有时间补一下
0418补了一个小时

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值