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

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

自己看到题目的第一想法

       // 第一思路:先是for循环暴力搜索匹配解决


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

       // 开始关注区间了,为什么会有两个区间这个来龙去脉并没有说清楚,可能是我菜。


       //快慢指针所代表的含义更具体,脑海中有指针流动的过程图。


自己实现过程中遇到哪些困难

       // 困难:区间开闭与循环条件的匹配上。


       //if (nums[fastIndex] != val)判断条件的理解


今日收获,记录一下自己的学习时长

       收获如下,3h


二分查找

// 一个小基础,nums.length和nums.length()的区别,前者length代表数组属性的调用,后者代表String类型length()方法的调用,用于返回该字符串的字符个数。


// 一点想法:


// 第二思路:二分法,区间开闭很关键;"mid值的声明初始化在循环语句中"的这个条件也很关键,用于调整搜索范围,有点递归的意思?


// 某种程度上,right值的定义直接决定了区间"左闭右开-[)"还是"左闭右闭-[]"的形式。这个很关键,这决定了为什么右后面两种区间的甄别。


其中"right = nums.length",表示数组长度,而数组索引从0开始的,则右边界是开区间,与此同时,right值的定义会影响循环判断条件,此时为:"while(left < right)";"right = nums.length - 1"表示最后一个元素索引,属于数组元素,所以是闭区间。此时循环条件为:"while(left <= right)"。

代码进化过程:

// 思路一:暴力循环
// class Solution {
//     public int search(int[] nums, int target) {
//         for (int i = 0; i < nums.length; i++) {
//             if (nums[i] == target) {
//                 return i;
//             }
//         }
//         return -1;
//     }
// }
// 思路二:二分查找,区间[]
// class Solution {
//     public int search(int[] nums, int target) {
//         int right = nums.length - 1;
//         int left = 0;
//         while (left <= right){
//             int mid = (left + right) / 2;
//             if (target == nums[mid]) {
//                 return mid;
//             } else if (target > nums[mid]) {
//                 left = mid + 1;
//             } else if (target < nums[mid]){
//                 right = mid - 1;
//             }
//         }
//         return -1;
//     }
// }
// 思路二调整:二分查找:区间为[)
class Solution {
    public int search(int[] nums, int target) {
        int right = nums.length;
        int left = 0;
        while (left < right){
            int mid = (left + right) / 2;
            if (target == nums[mid]) {
                return mid;
            } else if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]){
                right = mid;
            }
        }
        return -1;
    }
}

双指针

//两层for循环,第一层进行遍历,第二层进行覆盖操作。

// 注意点:需要新定义数组更改后的长度值size,数组的长度是一开始就定义好的,所以在删除数组元素时无法更改数组的长度,只能将其采取一个数值记录

暴力解法:
// class Solution {
//     public int removeElement(int[] nums, int val) {
//         int size = nums.length;
//         for (int i = 0; i < size; i++) {
//             if (nums[i] == val) {
//                 for (int j = i + 1; j < size; j++) {
//                     nums[j - 1] = nums[j];
//                 }
//                 i--;
//                 size--;
//             }
//         }
//         return size;
//     }
// }

// 快慢指针

// 慢指针代表新数组的长度,初始值为0。快指针作为筛选检索器,将不含有val值的数据选出赋给slowIndex新数组。仅仅对数组含有的val值进行了局部覆盖。

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

以上


相关文章
|
6天前
|
算法
简记二分算法模板与代码案例:整数二分和浮点数二分
本文介绍了两种算法模板,分别是整数二分和浮点数二分。
11 0
|
9天前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
19 2
|
11天前
|
算法 索引
【数据结构与算法 | 基础篇】力扣704/35/34:二分查找
【数据结构与算法 | 基础篇】力扣704/35/34:二分查找
|
13天前
|
数据采集 人工智能 自然语言处理
综述170篇自监督学习推荐算法,港大发布SSL4Rec:代码、资料库全面开源!
【5月更文挑战第20天】港大团队发布SSL4Rec,一个全面开源的自监督学习推荐算法框架,基于170篇相关文献的深入分析。SSL4Rec利用未标记数据提升推荐系统性能,解决了传统方法依赖大量标记数据的问题。开源代码与资料库促进研究复现与交流,为推荐系统领域带来新思路和工具。尽管面临数据需求大和依赖数据质量的挑战,但SSL4Rec展现出巨大的发展潜力和跨领域应用前景。[链接:https://arxiv.org/abs/2404.03354]
32 1
|
13天前
|
存储 算法 搜索推荐
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)(下)
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)
21 1
|
13天前
|
算法 编译器
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)(中)
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)
33 4
|
13天前
|
存储 算法 搜索推荐
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)(上)
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)
33 6
|
13天前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
27 1
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。
|
4天前
|
算法 数据安全/隐私保护 C++
基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真
该内容是关于一个图像水印算法的描述。在MATLAB2022a中运行,算法包括水印的嵌入和提取。首先,RGB图像转换为YUV格式,然后水印通过特定规则嵌入到Y分量中,并经过Arnold置乱增强安全性。水印提取时,经过逆过程恢复,使用了二维CS-SCHT变换和噪声对比度(NC)计算来评估水印的鲁棒性。代码中展示了从RGB到YUV的转换、水印嵌入、JPEG压缩攻击模拟以及水印提取的步骤。