一.数组
- 数组是存放在连续内存空间上的相同类型数据的集合。下标从0开始,数组内存空间的地址是连续的。
二.二分查找(leetcode704)
- 注意二分搜索的前提:有序不重复
- 不用纠结数组是奇数还是偶数的问题,因为middle只是为了确定一个界而已。是否是中间的那个数并不重要,如果target比middle小,排除右边的数字即可,至于左右两边数字的数量是否相等,并不重要。参考
- 区间的开闭确定时注意边界就好,注意考虑边界是否有意义是否能取到,其他正常理解就好,不用太拧巴
(可恶.我一开始只会暴力搜索了…并且还整了半天)
- 暴力解法
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 left=0;
int right=nums.length-1;
//int mid=left+(right-left)/2;注意mid是需要变换的
while(left<=right){
int mid=left+((right-left)/2);
if(target<nums[mid]){//注意不是和mid比,是和数组中的中间元素比较
right=mid-1;
}
else if(target>nums[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
}
-二分:区间左闭右开
class Solution {
public int search(int[] nums, int target) {
//左闭右开
int left=0;
int right=nums.length;//左闭右开的时候,右边取不到
//int mid=left+(right-left)/2;注意mid是需要变换的
while(left<right){
int mid=left+((right-left)/2);
if(target<nums[mid]){//注意不是和mid比,是和数组中的中间元素比较
right=mid;
}
else if(target>nums[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
}
三.删除元素(暴力解法,快慢指针)
- 暴力解题法
(leetcode上,java好像过不了??会超时,不过应该算法本身没啥问题)
class Solution {
public int removeElement(int[] nums, int val) {
int len=nums.length;
for(int i=0;i<nums.length;i++){
if(nums[i]==val){
for(int j=i+1;j<nums.length;j++){
nums[j-1]=nums[j];
}
i-=1;//注意因为往前面移了一位,因此i需要-1
len-=1;
}
}
return len;
}
}
- 快慢指针(leetcode27)
利用一个循环,来完成两个循环会完成的任务,不会改变元素的相对位置。
个人理解的主要思路:
快指针:遍历原始数组中的所有元素
慢指针:记录新数组的下标
当快指针遍历原始数组时,如果其所指向的元素与需要移除的元素不相等,那么将该元素“传递”慢指;当遍历元素与慢指针相同时,跳过即可。
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
for(int quick=0;quick<nums.length;quick++){
if(nums[quick]!=val){
nums[slow]=nums[quick];
slow+=1;
}
}
return slow;
}
}
ps:
1.大四好无聊…好无聊。我要找点事情做!然后跟着巨佬一起刷题。我觉得我可以的!!
2.day0怎么有巨佬大一就开始卷了啊…他们还会自己搭博客。好酷啊!!我也要
3.day1数组有啥考的啊…好的我错了。现在只会暴力搜索了(好吧…我以前的算法也很烂)!!