第一章 数组part01(第一天)

数组的基础知识

什么是数组

存储在一片连续的存储空间中,数据类型相同的数据集合
下标从 0 开始

数组连续存储带来的问题

增加、删除元素需要移动其他元素。不便于操作。

二维数组存储是否连续

在 C++ 中二维数组中的相邻元素存储在一片连续的地址空间中
在 Java 中,二维数组中第一维度的数据分别存储在连续的地址空间中

相关算法

704. 二分查找

题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:

算法思路

package day01.二分查找704;

/**
 * 

Title: 代码随想录

*

Description:

* * @author su.gd * @date 2023-05-11 */
public class Solution { public static void main(String[] args) { Solution solution = new Solution(); int[] nums = new int[]{-1,0,3,5,9,12}; System.out.println(solution.search2(nums, 13)); } /** * 三个位置变量:left mid right * 每次获取中间位置下标 mid * 如果 nums[mid] = target:返回 mid * 如果不等于,比较 nums[mid] 和 target 的大小 * 再继续查看 [left, mid-1] 和 [mid+1, right] 这两个区间,是否有满足的 * ——递归 *

* 结束条件不太明确:如果 left == right 后,值还是没有找到就可以退出了 * 时间复杂度如何看: **/ /** * 左闭右闭 **/ public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; int mid = 0; while (left <= right) { mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid -1; } } return -1; } /** * 左闭右开 * 能取到左边,但不能取到右边 * left = 0,right = nums.length * left < right,否则数组越界 * mid = (left + right -1) / 2; * * 中间值如何取:当 target < nums[mid] 时,这是 right = mid,作为边界值 * **/ public int search2(int[] nums, int target) { int left = 0; // 右边是取不到的 int right = nums.length; int mid = 0; // 右边是取不到的 while (left < right) { mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { // 这个边界值是取不到的 right = mid; } } return -1; } }

27. 移除元素

题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

算法思路

package day01.移除元素27;

/**
 * 

Title: 代码随想录

*

Description: 移除元素

* https://leetcode.cn/problems/remove-element/ * * @author su.gd * @date 2023-05-11 */
public class Solution { public static void main(String[] args) { } /** * 双指针法:(暴力求解) * 一个变量 length 来记录最终长度(这里其实就是 j,结果的实际长度) * 一个指针 i 用来循环遍历数据 * 如果 nums[i] = val,这个元素就可以被替换,用指针 j 来指向需要被替换的元素 * nums[j] = nums[i] * j 开始位于初始位置,当 j 位置的元素需要被替换的时候,j 再移动位置 * * 问题: * j 何时指向第一个需要被替换的元素:j 的位置直接用来记录有效元素,不是有效元素就不移动 * 由于 j 自加了,所以 j 就是最终有效元素的个数 **/ public int removeElement(int[] nums, int val) { int j = 0; // 边界判断 if (nums == null || nums.length == 0) { return 0; } for (int i = 0; i < nums.length; i++) { // j 用来记录有效元素的下标,当遇到 val 时,j 就不移动了,用来作为替换位置 if (nums[i] != val) { nums[j++] = nums[i]; } } // j 自加了,j 就是有效元素的个数 return j; } }

你可能感兴趣的:(leetcode,算法,数据结构)