数据结构学习笔记

本文探讨了数据结构中的集合、列表(线性列表)和数组的概念。特别强调了数组的操作,包括索引的重要性,并分享了使用二分法在排序数组中查找目标值的Java代码,以及关于二维数组的注意事项,如打印数组的方法和数组长度的获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

奈何最近未找到合适的记录软件,就暂时把自己的博客改造成学习笔记。由于出发点是供个人学习,可能层次不清,还望见谅。
目前的学习网站是leecode 
https://leetcode-cn.com/leetbook/read/array-and-string/ybfut/

集合,列表和数组

集合:由一个或多个确定的元素所构成的整体。
{1. 集合里的元素类型不一定相同 2. 集合里的元素没有顺序 }
列表(线性列表):是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。

列表最常见的表现形式有数组和链表,而栈和队列则是两种特殊类型的列表。

数组有一个非常重要的概念,索引

数组的操作
	数组的四种操作: 读取元素, 查找元素, 插入元素, 删除元素
	读取元素: 通过访问索引的方式来读取的,索引一般从0开始。计算机内存储数组会在一段**连续**的空间,并且会记下索引为0处的内存地址。
	1.找到该数组的索引0的内存地址
	2.将内存地址加上索引值。
	时间复杂程度是常数级别,O(1)

	查找元素
	从头到尾O(N)

	插入元素
	挪一挪,腾地方
	![元素插入数组的过程](https://img-blog.csdnimg.cn/202008051007571.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhcnBlZGllbV9zaXN5,size_16,color_FFFFFF,t_70)
	(链表可以解决这个问题)

	删除元素
	![删除元素,填补空缺](https://img-blog.csdnimg.cn/20200805100952943.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhcnBlZGllbV9zaXN5,size_16,color_FFFFFF,t_70)

看一道题目:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。

对于我自己的写法,那就是if else走天下,查到了一位小伙伴用二分法的java代码:

class Solution{
	public int searchInsert(int[] nums, int target){
		int lower = 0;
		int higher = nums.length - 1;
		int mid = -1;
		boolean flag = false;
		while(lower <= higher){
			mid = (higher + lower) / 2;
			if (nums[mid] < target){
				lower = mid + 1;
			}else if(nums[mid] > target){
				higher = mid - 1;
			}else {
				flag = true;
				return mid;
			}
		}
		if (nums[mid] > target){
			return mid - 1 >=0 ? mid : 0;
		}else{
			return mid + 1;
		}
	}
}

源码来自:https://blog.youkuaiyun.com/qq_41359651/article/details/100591458d

又发现了一个同学用C语言实现,非常简洁,于是乎改成java和大家分享一下:

class Solution {
	public int searchInsert(int[] nums, int target) {
		int dst = 0;
        while(dst < nums.length){
            if(nums[dst] < target){
                ++dst;
            }
            else{
                break;
            }
        }
        return dst;
	}
}

C语言源码来自:https://mp.weixin.qq.com/s?src=11&timestamp=1596597116&ver=2503&signature=ll7pUjBdIuwNUKB5LqobLVpbCLWfuCJhL4FidxfzUP60Ws0T9aEHOJOfLZmaM2f0mgtkKNlaFPUUdfnJj3q6riMRdzI8KaMXme0T1uv1b0zscl2qTO7qAZoE2I8kCLV&new=1*

补充一个注意点: java的二维数组,e.g. arr[][] ,第一个是行,第二个是每一行的第几列
数组值arr[x][y]表示指定的是第x行第y列的值
数组名后直接加上length(如arr.length),所指的是有几行(Row)
指定索引后加上length(如arr[0].length),指的是该行所拥有的元素,也就是列(Column)数目。

补充: Array.deepToString 可打印二维数组 Array.toString 可打印一维数组

补充: Lambda表达式

//不需要参数,返回值为5
() -> 5
//接收一个参数(数字类型),返回其2倍的值
x -> 2*x
//接受2个参数(数字),并返回他们的差值
(x, y)-> x - y
//接受2个int型整数,返回他们的和
(int x, int y) -> x + y
//接受一个string 对象,并在控制台上打印,不返回任何值
(String s) -> System.out.print(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值