1.题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题思路:
定义一个升序数组和一个目标值,定义getIndex()方法进行二分查找并在main方法中调用。
代码实现:
package day02;
public class t1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]nums= {-1,0,3,5,9,12};
int target=getIndex(nums,9);
System.out.println("索引:"+target);
}
public static int getIndex(int[] nums,int value) {
int max=nums.length-1;
int min=0;
int mid=(max+min)/2;//找到中间的数组下标
while(nums[mid]!=value) {//如果nums[mid]不等于value,继续查找
if(nums[mid]>value) {//如果nums[mid]>value,则最大的下标减小
max=mid-1;
}else if(nums[mid]<value) {//如果nums[mid]<value,则最小的下标增加
min=mid+1;
}
//加入判断
if(min>max) {//查找不到返回-1
return -1;
}
mid=(max+min)/2;
}
return mid;
}
}
结果:
索引:4
2.题目:
一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。目标下标 是一个满足 nums[i] == target 的下标 i 。将 nums 按非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按递增顺序排列。
解题思路:
定义数组和ArrayList列表,使用sort()方法将数组进行非递减顺序排序,用for和if语句找出目标下标i,添加到列表并输出。
代码实现:
package day02;
import java.util.*;
import java.util.ArrayList;
public class t2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]nums= {1,2,5,2,3};
int target=2;
ArrayList <Integer> array = new ArrayList<Integer>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++) {
if(nums[i]==target) {
array.add(i);
}
}
System.out.println(array);
}
}
结果:
[1, 2]
3.题目:
给定一个包含 n + 1
个整数的数组 nums
,其数字都在 [1, n]
范围内(包括 1
和 n
),可知至少存在一个重复的整数。假设 nums
只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums
且只用常量级 O(1)
的额外空间。
代码:
public class t3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]nums= {3,1,2,4,2};
int b=0;
for(int i=0;i<nums.length;i++) {
for(int x=0;x<i-1;x++) {
if(nums[i]==nums[x]) {
b=nums[x];
}
}
//System.out.println(b);
}
System.out.println(b);
}
}
结果:
2
代码运行出来了,但好像和题目前面的代码不一样,回来修改一下。