数组
- 二维数组在内存空间中是连续的,0x7ffee4065820 与 0x7ffee4065824 相差4个字节,因为一个int元素占4个字节。
- JAVA不暴露元素地址
二分查找
leetcode704
**题解:**简单二分法,需要注意的是,if结构中已经对nums[mid]==target的情况做出了判断,那么在对左右范围进行改变的时候就直接+1就好,否则会timeout。
**总结:**二分两种写法,一种是target在闭区间,此时while内部i=j是有意义的,左右范围都需要往前进一步,如下代码。第二种写法是左闭右开,此时while内不需要考虑i=j,且变化左侧区域时往前进一步即可。如果题目要求是问某个值在不在区间里,用左闭右闭区间(while l <= r),每个mid做大于、小于、等于三次判断,在等于时输出,循环结束未输出说明不在区间里;如果题目要求“找到第一个大于/小于x的下标”,用左闭右开区间(while l < r),每个mid做大于、小于等于两次判断,不在循环体里输出,循环结束返回l或r(l=r,不要返回mid),就是所求下标。
class Solution {
public:
int search(vector<int>& nums, int target) {
int i=0,j=nums.size()-1;
while(j>=i){
int mid=(i+j)/2;
if(nums[mid]>target){
j=mid-1;
}
else if(nums[mid]<target){
i=mid+1;
}
else{
return mid;
}
}
return -1;
}
};
leetcode35
**题解:**为什么最后return j+1呢?可能要仔细想想。循环不变量?
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int i=0,j=nums.size()-1;
while(i<j){
int mid=(i+j)/2;
if(nums[mid]>target){
j=mid-1;
}
else if(nums[mid]<target){
i=mid+1;
}
else{
return mid;
}
}
return j+1;
}
};
2024-04-07-22:45,实验室要关了,我什么时候才能发paper啊啊啊啊!!回宿舍!