明确自己刷题的目的
1.华为可信考试
2.继续打打基础不要忘
3.保持各个语法、算法的敏感度:主要针对python、c、cpp,有时间也可以看看go
今日学习的文章链接和视频链接
题目建议: 了解一下数组基础,以及数组的内存空间地址,数组也没那么简单。
704. 二分查找
还未看题解的思路:二分法凭感觉写
cpp版跟c语言版本差不多,语法上在指针上略有差别int right = numsSize-1;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0,right = nums.size()-1;
while(right-left>=0){
int mid = (right+left)/2;
if(nums[mid] == target){
return mid;
}else if(target>nums[mid]){
left = mid+1;
}else if(target<nums[mid]){
right = mid-1;
}
}
return -1;
}
};
看完题解的关注点:
1.二分法的前提:
数组为有序数组
数组中无重复元素
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
再写一个python版,对于防溢出这里还有一点疑问:mid = left +(right-left)//2,为什么这样就防溢出了,while(right-left>=0)
和while left<=right
有本质区别吗?时间太晚了明天在写
class Solution(object):
def search(self, nums, target):
left,right = 0,len(nums)-1
while left<=right:
mid = left +(right-left)//2
if nums[mid]<target:
left = mid+1
elif nums[mid]>target:
right = mid-1
else
return mid
return -1
- 移除元素
● 自己看到题目的第一想法,报错了
试试暴力:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++){
if (val == nums[i]){
for (int j = i+1;j < size; j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
● 看完代码随想录之后的想法
暴力解决:思路一致
双指针法:关键在于理解双指针分别的含义
快指针寻找新数组的元素,即不包含val的数组
慢指针指向新数组的地址位置
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
● 自己实现过程中遇到哪些困难
暴力解法的时候思路不够清晰,第二个for循环应该更清晰
for (int j = i+1;j < size; j++){
nums[j-1] = nums[j];
}
双指针需要多多复习
● 今日收获,记录一下自己的学习时长
第二道题还没有很扎实的思考一遍,但时间不够了
9点开始10点半结束1.5h,今天时间不是很充足,明天看看还有没有时间补一下
0418补了一个小时