数组
二分查找
二分查找就是给定一组排好序的数组,然后找到目标值。
- 思路:因为是排好序的,所以可以采用二分法,具体实现是确定区间和中间值,找到中间值然后和目标值进行比较,
如果大于目标值,说明目标值在相较小的那部分,调整区间为0到中间值对应的下标减一;小于目标值时,调整区间为
中间值下标加一到数组最右端。 - 当然以上的方法是默认区间为左闭右闭的,即[left,right],也可以写成左闭右开,此时调整为:
- 这里有一个小技巧,在计算取半值时,可以用>>1向右移位1个单位来代替 /2
移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
- 思路:容易想到的就是暴力解法,直接双for循环,这里用双指针思想更快点。
- 同向具体实现:当快指针所指的值不等于目标值时,快慢指针同时向前移动,每次遍历都让快指针的值覆盖慢指针,等于时,慢指针停下来,快指针继续前进。
- 相向具体实现:设置左右指针两个变量,左指针循环前进,当与目标值相同是,将右指针所指类容覆盖左指针内容,右指针向右前移一位。
有序数组平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序
- 思路:要求就是平方后再排序,暴力解法就是先平方组成一个数组,再排序。
- 双指针思路:设置双指针就是为了比较两个指针所指的数据,因此,将两指针分布在数组左右两侧,比较结果大的值优先放到新数组的
右侧,指针在对应方向上前移动。 - 具体实现:
长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
- 思路:可以暴力,但这里用滑动窗口解决,所谓滑动窗口,就是定义两指针,圈出一块数组出来。
- 如何规划双指针的移动,即就是移动窗口的移动,本题目的是保证窗口内的值大于目标数,所以起始位置指针要等待窗口内数
大于目标值时前移,终止位置就可以按照遍历节奏前移。 - 具体实现:
螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
- 思路:没什么特殊算法,目的是模拟代码的运行,关键在于把控好元素在矩阵中的位置,正常打印的话就是按照每条边去输入
,既然如此,就是要控制好什么时候停止输入,即终止的位置。 - 具体思路:根据所给n计算最大需要转的圈数,在保证圈数不超过最大的情况下,让每条边依此输入所需元素值。
区间和
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和
- 思路:本题用到了常见解题思路,前缀和,因为直接累加容易超时,所以直接存储前缀的和为一个新数组,这样求区间和时,只需要相减即可。
- 具体实现:
开发商购买土地
在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。
现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。
为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
注意:区块不可再分。
【输入描述】
第一行输入两个正整数,代表 n 和 m。
接下来的 n 行,每行输出 m 个正整数。
输出描述
请输出一个整数,代表两个子区域内土地总价值之间的最小差距。
【输入示例】
3 3 1 2 3 2 1 3 1 2 3
【输出示例】
0
- 思路: 其实还是前缀和的考察,要求是只能横着切或者竖着切,所以分步骤进行,先按照行去切,去拿某一行的2倍与总数去比
,如果等于说明均分了,不等时,结果就是两者差值,同样的方法比较横竖各自对应的差值,然后一起比较最小值,就能得到最小结果。 - 具体实现: