复习java算法基础

1、求两数之和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFzE4uSy-1689241467003)(file://C:\Users\gr\AppData\Roaming\marktext\images\2023-07-11-10-17-58-image.png?msec=1689041878551)]

暴力写法:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; ; i++) // 枚举 i
           for (int j = i + 1; j < nums.length; j++) // 枚举 i 右边的 j
                if (nums[i] + nums[j] == target) // 满足要求
                    return new int[]{i, j}; // 返回两个数的下标
        // 题目保证有解,循环中一定会 return
        // 所以这里无需 return,毕竟代码不会执行到这里
    }
}
  • 时间复杂度:: O ( n 2 ) ,其中 n 为 nums 的长度量。 时间复杂度::\mathcal{O}(n^2),其中 n 为 \textit{nums} 的长度量。 时间复杂度::O(n2),其中nnums的长度量。

  • 空间复杂度: O ( 1 ) 。仅用到若干额外变量。 空间复杂度:\mathcal{O}(1)。仅用到若干额外变量。 空间复杂度:O(1)。仅用到若干额外变量。

哈希表写法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> idx = new HashMap<>(); // 创建一个空哈希表
        for (int j = 0; ; j++) { // 枚举 j
            int x = nums[j];
            // 在左边找 nums[i],满足 nums[i]+x=target
            if (idx.containsKey(target - x)) // 找到了
                return new int[]{idx.get(target - x), j};//返回两个数的下标
            idx.put(x, j); // 保存 nums[j] 和 j
        }
    }
}
复杂度分析
  • 时间复杂度: O ( n ) ,其中 n 为 nums 的长度。 时间复杂度:\mathcal{O}(n),其中 n 为 \textit{nums}的长度。 时间复杂度:O(n),其中nnums的长度。

  • 空间复杂度: O ( n ) 。哈希表需要 O ( n ) 的空间。 空间复杂度:\mathcal{O}(n)。哈希表需要 \mathcal{O}(n)的空间。 空间复杂度:O(n)。哈希表需要O(n)的空间。

相比暴力做法,哈希表消耗了内存空间,减少了运行时间,这就叫「空间换时间」。

2、判断是否为回文数字:

方法一(数学方法):

class Solution {
    public boolean isPalindrome(int x) {
     // 特殊情况:
     // 如上所述,当 x < 0 时,x 不是回文数。
     // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
     // 则其第一位数字也应该是 0
     // 只有 0 满足这一属性
         if (x < 0 || (x % 10 == 0 && x != 0)) {
             return false;
         }
        int revertedNumber = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
    // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
    // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x == revertedNumber || x == revertedNumber / 10;
    }
}

时间复杂度: O ( l o g n ) ,对于每次迭代,我们会将输入除以  10 ,因此时间复杂度为  O ( l o g n ) 。 时间复杂度:O(logn),对于每次迭代,我们会将输入除以 10,因此时间复杂度为 O(logn)。 时间复杂度:O(logn),对于每次迭代,我们会将输入除以 10,因此时间复杂度为 O(logn)

空间复杂度: O ( 1 ) 。我们只需要常数空间存放若干变量。 空间复杂度:O(1)。我们只需要常数空间存放若干变量。 空间复杂度:O(1)。我们只需要常数空间存放若干变量。

方法二(先将整形转换为字符串类型,再将字符串反转与之前的字符串相比较,一样就返回true,否则返回false。):

class Solution {
    public boolean isPalindrome(int x) {
        Scanner sc=new Scanner(System.in);
        
        String str =Integer.toString(x);
        boolean isHuiwen= new StringBuilder(str).reverse().toString().equals(str);
        if(isHuiwen)
            return true;
            else
            return false;
    }
}

你可能感兴趣的:(算法,java,数据结构)