热门Leetcode NO.1、NO.31

 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下一个排列:

题目:

 

 

思路:

两遍遍历

  1. 第一遍,从右往左,找到第一对顺序相邻的数   nums[i] > nums[i+1]。如果没找到,说明逆序,字典顺序已经最大。
  2. 第二遍, 从右往左,找到第一个比它大的数nums[j],交换。反转i位置及以后的数。

例如数据    2 3 5 4 1

  1. 从右往左找第一个顺序对:    3 5  nums[j]  =  3
  2. 在从右往左找第一个比 3 大的数    num[j]   =  4
  3. 交换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--;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值