这次的两道题是课上的小练习,第一题是要求分别使用“暴力解法”和优化方法完成两数之和,而第二道题是完成我们常见的排序之一(选择排序)。
1.两数之和
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
1.暴力解法
用了两边for循环进行遍历,时间复杂度O(n^2).
class Solution {
public int[] twoSum(int[] nums, int target) {
int i;
int j;
int [] result=new int[2];
for(i=0;i<nums.length;i++){
for(j=i+1;j<nums.length;j++){
int add=nums[i]+nums[j];
if(target==add){
result[0]=i;
result[1]=j;
return result;
}
}
}
return new int[0];
}
}
2.利用哈希表,时间复杂度:O(n).
思考:对于这道利用哈希表来完成的两数之和,会在下一块LeetCode的哈希表学习中再总体来归纳一遍.
class Solution {
public int[] twoSum(int[] nums, int target) {
//先固定一个元素,然后找另外一个元素,是使用哈希表
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
int [] result=new int[2];
int i;
for(i=0;i<nums.length;i++){
int temp=target-nums[i];
if(map.containsKey(temp)){
result[0]=i;
result[1]=map.get(temp);
return result;
}
//值作为key,而对应索引作为value
map.put(nums[i],i);
}
return new int[0];
}
}
2.选择排序:
*选择排序需要设置两层for循环,先固定一个值然后逐个与当前固定值后面的所有值进行比较,然后进行比较后换位置,最后得到正确解答。
//实现
public class Sort {
public void chsort(int [] nums){
int temp;
int i;
int j;
for(i=0;i<nums.length;i++){
for(j=i+1;j<nums.length;j++){
if(nums[i]>nums[j]){
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
}
}
//测试
public class test {
public static void main(String []args){
int[] a=new int[]{2,67,9,89,3,8,5,66,76,56,84,104};
Sort s=new Sort();
s.chsort(a);
System.out.println(Arrays.toString(a));
}
}