题目1:【二刷完成】
代码1:
class Solution {
public int search(int[] nums, int target) {
/*使用左闭右闭*/
int i=0;
int j=nums.length-1;
while(i<=j){
int m=(i+j)>>>1;//二进制右移一位,相当于除以2
if(target<nums[m]){
j=m-1;
}else if(target>nums[m]){
i=m+1;
}else{
return m;
}
}
return -1;
}
}
class Solution {
public int search(int[] nums, int target) {
/*使用左闭右开*/
int i=0;
int j=nums.length;
while(i<j){
int m=(i+j)>>>1;
if(target<nums[m]){
j=m;
}else if(target>nums[m]){
i=m+1;
}else{
return m;
}
}
return -1;
}
}
题目2:【二刷完成】
思路2:
- 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
- 暴力解法中外循环就要先找出需要删除元素的位置,然后用下一个不是被找出元素去覆盖它,来得到新的数组
- 双指针相比较与暴力解法,是从数组中选出不是被找的元素,然后进行覆盖
代码2:
class Solution {
public int removeElement(int[] nums, int val) {
/*暴力解法 */
int a=nums.length;
for ( int i=0; i<a; i++){
if (nums[i]==val){
for (int j=i+1; j<a; j++){
nums[j-1]=nums[j];
}
i--;
a--;
}
}
return a;
}
}
class Solution {
public int removeElement(int[] nums, int val) {
/*双指针 */
int lowindex=0;
for (int fastindex=0; fastindex<nums.length; fastindex++){
if (nums[fastindex]!=val){
nums[lowindex++]=nums[fastindex];
}
}
return lowindex;
}
}
总结:
1.关于二分查找的区间开闭的问题
2.数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖【这句话之前没意识到就出现错误了】