LeetCode

简介: LeetCode

2. 两数相加

  public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode ln = new ListNode();
        ListNode p1 = l1, p2 = l2, p = ln;
        // 标志上一位如果超过10,下一位进1,即加一
        int flag = 0;
        while (p1 != null || p2 != null) {
            // p1,p2指向null 则值为0
            int num1 = p1 == null ? 0 : p1.val;
            int num2 = p2 == null ? 0 : p2.val;
            int res = num1 + num2 + (flag == 1 ? 1 : 0);
            p.val = res % 10;
            flag = 0;
            if (res > 9) flag = 1;
            // p1,p2 指向下一个节点,直到指向null为止.
            p1 = p1 == null ? p1 : p1.next;
            p2 = p2 == null ? p2 : p2.next;
            if (p1 == null && p2 == null) {
                // 结束最后一位, 也需进一,
                if (flag == 1) {
                    p = p.next = new ListNode();
                    p.val = 1;
                }
                p.next = null;
            } else
                p = p.next = new ListNode();
        }
        return ln;
    }

3. 无重复字符的最长子串

  public static int lengthOfLongestSubstring(String s) {
        int max = 0;
        char[] chars = s.toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            for (int j = i; j < s.length(); j++) {
                // 存在跳出, 不存在加入
                if(sb.indexOf(chars[j] + "") != -1) break;
                else sb.append(chars[j]);
                if (sb.length() > max) max = sb.length();
            }
            //重置字符串sb
            sb.setLength(0); 
        }
        return max;
    }

7. 整数反转

/**
 * @Author Tiam
 * @Date 2022/6/28 13:13
 * @Description: 7. 整数反转  victory
 */
public class Demo06 {
    public static void main(String[] args) {
        System.out.println(reverse(2432));
    }

    public static int reverse(int x) {
        long n = x % 10;
        while ((x /= 10) != 0) {
            n = n * 10 + x % 10;
        }
        if (n > Integer.MAX_VALUE || n < Integer.MIN_VALUE) return 0;
        return (int)n;
    }
}

8. 字符串转换整数 (atoi)

/**
 * @Author Tiam
 * @Date 2022/6/28 19:02
 * @Description: 8. 字符串转换整数 (atoi) victory
 */
public class Demo07 {
    public static void main(String[] args) {
//        System.out.println(4365 / 100.0);
//        System.out.println(Character.digit('0', 10));
        System.out.println(myAtoi("-91283472332"));
        //System.out.println(Double.parseDouble("-43.234"));
    }

    public static int myAtoi(String s) {
        if ("".equals(s.trim())) return 0;
        char[] chars = s.trim().toCharArray();
        long n = 0;
        //标记负数
        int i = 0, flag = 0;
        if (!Character.isDigit(chars[i])) {
            if (chars[i] == '-') {
                flag = 1;
            } else {
                if (chars[i] != '+') return 0;
            }
            i++;
        }
        for (; i < chars.length; i++) {
            //判断是否为数字
            if (Character.isDigit(chars[i])) {
                n = n * 10 + Character.digit(chars[i], 10);
                if (flag == 0 && n > Integer.MAX_VALUE) {
                    return Integer.MAX_VALUE;
                }
                if (flag == 1 && -n < Integer.MIN_VALUE) {
                    return Integer.MIN_VALUE;
                }
            } else {
                break;
            }
        }
        n = flag == 0 ? n : -n;
        return (int) n;
    }
}

9. 回文数

/**
 * @Author Tiam
 * @Date 2022/6/29 8:12
 * @Description: 9. 回文数  victory
 */
public class Demo08 {
    public static void main(String[] args) {
        System.out.println(isPalindrome(121));
    }

    public static boolean isPalindrome(int x) {
        if (x < 0) return false;
        int n = 0, m = x;
        while (x > 0) {
            n = n * 10 + x % 10;
            x /= 10;
        }
        return m == n ? true : false;
    }
}

704. 二分查找

/**
 * @Author Tiam
 * @Date 2022/6/29 8:41
 * @Description:   704. 二分查找  victory
 */
public class Demo09 {
    public int search(int[] nums, int target) {
        int low = 0,high = nums.length-1,mid;
        while (low<=high){
            mid = (low + high)/2;
            if(nums[mid]>target)
                high = mid - 1;
            else if(nums[mid]<target)
                low = mid + 1;
            else
                return mid;
        }
        return -1;
    }
}

278. 第一个错误的版本

/**
 * @Author Tiam
 * @Date 2022/6/29 8:47
 * @Description: 278. 第一个错误的版本   false false true true true
 *                                  victory
 */
public class Demo10 {
    public static void main(String[] args) {
        System.out.println(firstBadVersion(2126753390));
    }

    public static int firstBadVersion(int n) {
        long low = 1, high = n, mid;
        while (low <= high) {
            mid = (low + high) / 2;
            if (isBadVersion((int) mid) && !isBadVersion((int) mid - 1))
                return (int) mid;
            else if (isBadVersion((int) mid)) {
                high = mid - 1;
            } else
                low = mid + 1;
        }
        //无解抛出异常
        throw new IllegalArgumentException("The equation has no solution");
    }

    static boolean isBadVersion(int n) {
        if (n >= 1702766719)
            return true;
        else
            return false;
    }
}

35. 搜索插入位置

/**
 * @Author Tiam
 * @Date 2022/6/29 10:01
 * @Description: 35. 搜索插入位置  victory
 *                   在升序数组nums中,寻找target,找到返回其下标,没找到返回其待插入的位置。
 */
public class Demo11 {
    public static void main(String[] args) {
        int[] nums = {1, 3, 5, 6};
        int target = 4;
        System.out.println(searchInsert(nums, target));
    }

    public static int searchInsert(int[] nums, int target) {
        int low = 0, high = nums.length - 1, mid;
        while (low <= high) {
            mid = (low + high) / 2;
            if (nums[mid] > target)
                high = mid - 1;
            else if (nums[mid] < target)
                low = mid + 1;
            else
                return mid;
        }
        return low;
    }
}

删除排序数组中的重复项

/**
 * @Author Tiam
 * @Date 2022/6/29 12:23
 * @Description:  删除排序数组中的重复项  victory
 */
public class Demo12 {
    public static void main(String[] args) {
        int[] nums = {0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4};
        System.out.println(removeDuplicates_(nums));
    }

    public static int removeDuplicates(int[] nums) {
        int count = 0;
        for (int i = 0; i < nums.length - count - 1; ) {
            if (nums[i] == nums[i + 1]) {
                for (int j = i + 1; j < nums.length - count - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                count++;
            } else i++;
        }
        return nums.length - count;
    }
    /** 方式二 */
    public static int removeDuplicates_(int[] nums) {
        int p = 0, q = 1;
        for(;q < nums.length;q++)
            //寻找右指针与当前p不同的值, 存储到p的下一位.
            if(nums[p] != nums[q]) nums[++p] = nums[q];
        return ++p;
    }
}

买卖股票的最佳时机 II

/**
 * @Author Tiam
 * @Date 2022/6/29 13:01
 * @Description: 买卖股票的最佳时机 II   victory
 */
public class Demo13 {
    public static void main(String[] args) {
        //int[] nums = {1,2,3,4,5};
        //int[] nums = {7,1,5,3,6,4};
        //int[] nums = {7,6,4,3,1};
        int[] nums = {2, 1, 2, 0, 1};
        System.out.println(maxProfit(nums));

    }

    public static int maxProfit(int[] prices) {
        // -1 标记未购入
        int in = -1, rise = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            if (prices[i + 1] > prices[i] && in == -1)
                in = prices[i];
            if (prices[i + 1] < prices[i] && in != -1) {
                rise += prices[i] - in;
                in = -1;
            } else if (i + 1 == prices.length - 1 && in != -1) {
                rise += prices[i + 1] - in;
                in = -1;
            }
        }
        return rise;
    }
}

实现 pow(x, n)

/**
 * @Author Tiam
 * @Date 2022/6/29 14:38
 * @Description: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
 */
public class Demo14 {
    public static void main(String[] args) {
        System.out.println(myPow(2.00000, -2147483648));
        System.out.println(myPow_(5, -1));
    }
    /** x的n次方,适用于正整数求幂 */
    public static int myPow_(int x, int n) {
        int r = 1;
        while (n > 1) {
            if ((n & 1) == 1) r *= x;
            x *= x;
            n >>= 1;
        }
        return r * x;
    }

    public static double myPow(double x, int n) {
        //特殊情况
        if (x == 1) return 1;
        if (x == 0) return 0;
        if (x == -1) return n % 2 == 0 ? 1 : -1;
        if (n == Integer.MIN_VALUE) return 0.0;
        int flag = 0;
        if (n < 0) {
            n = -n;
            flag = 1;
        }
        double res = 1.0;
        for (int i = 0; i < n; i++) {
            res *= x;
        }
        return flag == 0 ? res : 1 / res;
    }
}

存在重复元素,返回true,否则 false

/**
 * @Author Tiam
 * @Date 2022/6/30 8:28
 * @Description:  存在重复元素,返回true,否则 false
 */
public class Demo15 {
    public static void main(String[] args) {
        int[] nums = {1,2,3,4};
        System.out.println(containsDuplicate_1(nums));
    }
    public static boolean containsDuplicate(int[] nums) {
        for (int i = 0; i<nums.length;i++){
            for (int j = i+1; j < nums.length; j++) {
                if(nums[j] == nums[i])
                    return true;
            }
        }
        return false;
    }
    public static boolean containsDuplicate_(int[] nums) {
        // 先排序后,重复的元素会相邻
        Arrays.sort(nums);
        for (int i = 0; i<nums.length-1;i++){
            if(nums[i] == nums[i+1])
                return true;
        }
        return false;
    }
    /**
     * set集合不能含有重复元素
     * add 添加元素时,如含有重复元素则添加失败返回 false
     * 较上面效率更高
     */
    public static boolean containsDuplicate_1(int[] nums) {
        HashSet<Object> objects = new HashSet<>();
        for(int i: nums){
            if(!objects.add(i))
                return true;
        }
        return false;
    }
}

977. 有序数组的平方

/**
 * @Author Tiam
 * @Date 2022/6/30 9:00
 * @Description: 977. 有序数组的平方
 */
public class Demo16 {
    public static void main(String[] args) {
        System.out.println(5);
    }
    public int[] sortedSquares(int[] nums) {
        int[] squares = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            squares[i] = nums[i] * nums[i];
        }
        Arrays.sort(squares);
        return squares;
    }

    public int[] sortedSquares_(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] *= nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

189. 轮转数组

/**
 * @Author Tiam
 * @Date 2022/6/30 9:30
 * @Description: 189. 轮转数组
 */
public class Demo17 {
    public static void main(String[] args) {
        int[] nums = {0, 1, 2, 3};
        rotate(nums, 2);
        System.out.println(Arrays.toString(nums));
    }

    /**
     * 超时 overtime
     */
    public void rotate_(int[] nums, int k) {
        int temp;
        for (int i = 0; i < k; i++) {
            temp = nums[nums.length - 1];
            for (int j = nums.length - 1; j > 0; j--) {
                nums[j] = nums[j - 1];
            }
            nums[0] = temp;
        }
    }

    public static void rotate(int[] nums, int k) {
        // 复制数组
        int[] nums_ = Arrays.copyOf(nums, nums.length);
        for (int i = 0; i < nums.length; i++) {
            int j = i + k;
            if (j > nums.length - 1) j %= nums.length;
            nums[j] = nums_[i];
        }
    }
}
相关文章
|
7月前
|
算法
leetcode:389. 找不同
leetcode:389. 找不同
32 0
|
索引
LeetCode 354. Russian Doll Envelopes
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
83 0
LeetCode 354. Russian Doll Envelopes
leetcode 283 移动零
leetcode 283 移动零
58 0
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
183 0
leetcode第49题
leetcode第53题
解法一和解法二的动态规划,只是在定义的时候一个表示以 i 开头的子数组,一个表示以 i 结尾的子数组,却造成了时间复杂度的差异。问题就是解法一中求出了太多的没必要的和,不如解法二直接,只保存最大的和。
leetcode第53题
leetcode第51题
较经典的回溯问题了,我们需要做的就是先在第一行放一个皇后,然后进入回溯,放下一行皇后的位置,一直走下去,如果已经放的皇后的数目等于 n 了,就加到最后的结果中。然后再回到上一行,变化皇后的位置,然后去找其他的解。 期间如果遇到当前行所有的位置都不能放皇后了,就再回到上一行,然后变化皇后的位置。再返回到下一行。 说起来可能还费力些,直接看代码吧。
leetcode第51题
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
106 0
leetcode第42题

热门文章

最新文章