#算法#二分查找#移除元素#leetcode#数组
今天是算法练习的第一天,本应该紧张激动,但是因为这两道题目之前都做过,跟单词书里面的“abandon”一样,比较熟悉了,所以感觉还算容易。
数组
平时用的比较多,虽然都是Java封装好的数据结构,但是对数组还是比较熟悉,就直接做题了。题目链接:第一章 数组part01
704. 二分查找
二分查找,首先是对已经排好序的数组可以用这个方法,非排序的就不能用此方法。我对二分法的朴素理解就是对半查询,以升序的数组为例,取中间的元素,如果中间的元素大于目标值target,那target肯定就在数组的左侧,中间元素小于target,则target就在数组的右侧。阶梯代码如下:
public int search(int[] nums, int target) {
if(null == nums) {
return -1;
}
int length = nums.length;
int left = 0;
int right = length -1;
while(left <= right) {
int mid = (left + right)/2;
if(target > nums[mid]) {
left = mid+1;
} else if (target < nums[mid]) {
right = mid -1;
} else {
return mid;
}
}
return -1;
}
第一次是失败了的,因为循环遍历的条件不对,没有取 = 的情况,导致部分用例会执行失败。
27.移除元素
这个题目很有意思,因为我印象中大学学C的时候老是黑板上经常说的就是数组的删除。这里按照卡尔的要求,用了暴力和双指针两种方法解决问题。 暴力破解,这里有个细节容易忽略,需要注意:我们在移除的时候,数组本身是变化的,需要做对应的梳理。 双指针的方法比较巧妙,我也是反复想了挺长时间,第一时间我是想到了左右指针,但是目前还没实现,按照卡尔大佬的思路来解决,看似没有删除但实际已经删除!具体代码(暴力解法跑完通过就注释了):
public int removeElement(int[] nums, int val) {
if(null == nums) {
return 0;
}
int length = nums.length;
//violent solution
// for(int i = 0; i < length; i++){
// if(nums[i] == val) {
// for(int j = i + 1; j < length; j++) {
// nums[j - 1] = nums[j];
// }
// i--;
// length--;
// }
// }
// two pointers solution
int pre = 0;
int cur = pre;
for(; pre < length; pre++) {
if(nums[pre] != val) {
nums[cur] = nums[pre];
cur++;
}
}
return cur;
}
整体感觉就是题目属于简单,但是有些细节还是很巧妙,其实这些点还是可以用到工作中的。双指针的题目设计都比较巧妙,后面的任务继续练习吧。

764

被折叠的 条评论
为什么被折叠?



