Java刷题 共勉
我是按照代码随想录的顺序刷的,github 地址,看到记得给个star
刷题顺序
数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构
数组
数组基础
- 数组是存放在连续内存空间上的相同类型数据的集合。
- 数组的元素是不能删的,只能覆盖。
- 在java中, 二维数组的每一行头结点的地址是没有规则的,更谈不上连续。
704. 二分查找
题解
/*
*给定一个n个元素有序的(升序)整型数组nums 和一个目标值target,写一个函数搜索nums中的
* target,如果目标值存在返回下标,否则返回 -1。
*/
public class Solution {
public int search(int[] nums,int target){
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if(target<nums[0]||target>nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length-1;
while(left<=right){
int middle = left + (right-left)/2; // 防止内存溢出 而不是使用int middle=(left+right)/2
if(nums[middle]>target){
right = middle;
}else if(nums[middle]<target){
left = middle;
}else{
return middle;
}
}
return -1;
}
}
想法
二分查找的条件
- 有序数组
- 无重复数据
二分查找需要注意的点
- 区间的划分 使用左闭右闭 所以right==left是有意义的
- 以后需要严格按照区间划分来写代码
- 区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。
27. 移除元素
题解
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length-1;
int i=0; // 不等于val的元素数量
int j=0; // 遍历元素
while(j<=length){
if(nums[j]!=val){
// 将不等于val从头到尾拿出来
nums[i++] = nums[j]; // 用j处的数据覆盖i处的数据 i++
}
j++;
}
return i;
}
}
想法
1.数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
977.有序数组的平方
题解
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length]; // 定义必须初始化
int i = 0;
int j = 0;
int length = nums.length-1;
while(i<=length){
res[j++] = nums[i]*nums[i];
i++;
}
// 排序
// 冒泡排序 从小到大
for(int m =0;m<=length;++m){
// n次排序过程
for(int n=1;n<=length-m;++n){
// 为什么这里是n<length-m 知道了 因为一次排序 最大的数必排到了最后面
if(res[n-1]>res[n]){
int temp = res[n-1];
res[n-1] = res[n];
res[n] = temp;
}
}
}
return res;
}
}
用双指针法 速度快
class Solution {
public int[] sortedSquares(int[] nums) {
// 双指针法
// 最大的数必在最右边或者最左边
// 不同的是 只能交换 不能覆盖
int length = nums.length;
int[] res = new