8:20-10:50,耗时2.5小时
704. 二分查找 10min
简单题,需要注意区间的开闭,是左闭右开,还是左闭右闭等。
中间遇到了数组使用 length() 的报错。数组是length(是属性),字符串是length()(是方法)。参考文章如下:Java中length、length()、size()区别_nums1.length()和nums1.lengthjava-CSDN博客
补充知识:
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length;
int temp ;
while(left<right){
temp=(left+right)/2;
if(nums[temp]==target) return temp;
if(nums[temp]>target){
right=temp;
}else{
left=temp+1;
}
}
return -1;
}
}
27. 移除元素 31:05min
27. 移除元素 - 力扣(LeetCode)
简单,但是思路出了岔路,导致耗时比较久。
最初想法:两个指针i,j。一个快一个慢。一个一个赋值,如果遇到相等的跳过即,j++。不相等的时候,i++、j++。出现越界的问题。
参考代码随想录之后的方法:只需要在不相等的时候赋值就行。快慢指针。
class Solution {
public int removeElement(int[] nums, int val) {
int k=0,i=0,j=0;
for(i=0;j<nums.length;j++){
if(nums[j]!=val){
nums[i]=nums[j];
i++;
}
}
return i;
}
}
977. 有序数组的平方 13:10min
977. 有序数组的平方 - 力扣(LeetCode)
简单
思路:最开始想到了从两边比较谁最大,将谁放进去,最后再反转一下数组,没有想到数组直接可以从后面遍历。
相关知识:
绝对值:Math.abs()
class Solution {
public int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];
int left=0,right=nums.length-1;
int index = result.length - 1;
while(left<=right){
if(Math.abs(nums[left]) > Math.abs(nums[right])){
result[index--]=nums[left]*nums[left];
left++;
}else{
result[index--]=nums[right]*nums[right];
right--;
}
}
return result;
}
}
35. 搜索插入位置 13:10min
简单
出现的问题:
1. 左右区间弄反了。
2. 题目解读有误,以为是要返回排序后的数组
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0,right =nums.length-1;
int temp;
while(left<=right){
temp = left+(right-left)/1;
// System.out.println(temp);
if(nums[temp]==target) return temp;
else if(nums[temp]>target) right=temp-1;
else left=temp+1;a
}
return right+1;
}
}
34. 在排序数组中查找元素的第一个和最后一个位置 12:51min
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
出现越界问题,思路没有问题。
应该加一个判断,判断是否越界
while(left - 1 >= 0 && nums[left-1]==target) left--;
while(right + 1 < nums.length && nums[right+1]==target) right++;
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result={-1,-1};
int left=0,right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>target) right=mid-1;
else if(nums[mid]<target) left=mid+1;
else{
left=mid;
right=mid;
while(left - 1 >= 0 && nums[left-1]==target) left--;
while(right + 1 < nums.length && nums[right+1]==target) right++;
result[0]=left;
result[1]=right;
return result;
}
// System.out.println(result[0]+" "+result[1]);
}
return result;
}
}