P1 两数和
题目:
思路:
1.暴力法: 时间复杂度:O(N^2)
双层循环,当找到一个数 num[i] = target - num[j] 的时候
返回下标 new int[]{i,j}
2.哈希表存储法: 时间复杂度O(N)
key 存数 , value 存下标
* 遍历一遍数组
* 如果有取到值 hashMap.containsKey(targert - num[i]),返回答案new int[]{hashMap.get(targert - num[i]),i}
* 否则将当前数存进去
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> hashMap = new HashMap<>();
for(int i =0;i<nums.length;i++){
if(hashMap.containsKey(target - nums[i])){
return new int[]{hashMap.get(target-nums[i]),i};
}
hashMap.put(nums[i],i);
}
return new int[]{0};
}
}
#P31下一个排列:
题目:
思路:
两遍遍历
- 第一遍,从右往左,找到第一对顺序相邻的数 nums[i] > nums[i+1]。如果没找到,说明逆序,字典顺序已经最大。
- 第二遍, 从右往左,找到第一个比它大的数nums[j],交换。反转i位置及以后的数。
例如数据 2 3 5 4 1
- 从右往左找第一个顺序对: 3 5 nums[j] = 3
- 在从右往左找第一个比 3 大的数 num[j] = 4
- 交换i j
代码:
class Solution {
public void nextPermutation(int[] nums) {
int i = nums.length-2;
while( i>=0 && nums[i]>=nums[i+1]){ //从右往左找第一个逆序对
i--;
}
if(i>=0){
int j = nums.length-1;
while(j>=0 && nums[i]>=nums[j]){ //从右往左找比nums[j]大的数
j--;
}
swap(nums,i,j);
}
reverse(nums,i+1);
}
public void swap(int[]nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public void reverse(int[] nums,int start){
int end = nums.length-1;
while(start<end){
swap(nums,start,end);
start++;
end--;
}
}
}