重拾刷题路02

笔记0】系列目录索引(持续更新 & 推荐收藏) 前言: 自从大三渐渐退了acm之后就没有再系统的进行算法训练了,甚至本科毕业后就基本没做过算法。最近深感自己这方面退步巨大,算法思维一停下来就不敏感了。所以希望以这个系列为契机,一方面通过从基础开始,把自己的算法思维再培养起来,好好锻炼一下基本功,另外也记录一下自己的过程,希望能对其他同学的学习也有所帮助。虽然目每日一可能有点困难,但求上则居中希望给自己点压力,能坚持下来,尽可能的多,早日找回状态。冲冲冲! 本文作为整个系列的目录索引,方便整理查阅,会持续更新,如果对你有帮助,收藏... 阅读详情

2022-03-13

268. Missing Number(Easy)

(8) Missing Number - LeetCode

要求:空间复杂度O(1),时间复杂度O(n)

(1)交换位置:注意,在一个位置上不能只交换一次!

class Solution {
    public int missingNumber(int[] arr){
        int i = 0;
        while (i < arr.length){
            int correct = arr[i];
            if (arr[i] < arr.length && arr[i] != arr[correct]){
                swap(arr, i, correct);
            } else {
                i++;
            }
        }
        //search for missing number
        for (int index = 0; index < arr.length; index++){
            if(arr[index] != index){
                return index;
            }
        }
        return arr.length;
    }

    private void swap(int [] arr, int first, int second){
        int temp = arr[first];
        arr[first] = arr[second];
        arr[second] = temp;
    }
}

(2)1+2+...+n= n*(n+1)/2。所以用 n*(n+1)/2减去所有数字,剩下的就是缺失的那个:

class Solution {
     public int missingNumber(int[] nums) {
        int n=nums.length;
        int sum=n*(n+1)/2;
        for(int i:nums){
            sum-=i;
        }
        return sum;
    }
}

1. Two Sum(Easy)

(8) Two Sum - LeetCode

(1)双层循环

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        result[0] = -1;
        result[1] = -1;
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return result;
    }
}

(2)使用map

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] result = new int[2];
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < numbers.length; i++) {
            if (map.containsKey(target - numbers[i])) {
                result[1] = i;
                result[0] = map.get(target - numbers[i]);
                return result;
            }
            map.put(numbers[i], i);
        }
        return result;
    }
}

 202. Happy Number(Easy)

(8) Happy Number - LeetCode

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> resultSet = new HashSet<>();
        int result = n;
        while (result != 1) {
            List<Integer> digits = new ArrayList<>();
            while (result > 0) {
                int digit = result % 10;
                result /= 10;
                digits.add(digit);
            }
            for (int digit : digits) {
                result += digit * digit;
            }
            if (resultSet.contains(result)) {
                break;
            }
            resultSet.add(result);
        }
        return result == 1;
    }
}

2022-03-20

349. Intersection of Two Arrays(Easy)

Intersection of Two Arrays - LeetCode

直接整个set就行了:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> numSet = new HashSet<>();
        for (int num : nums1) {
            numSet.add(num);
        }
        Set<Integer> resultSet = new HashSet<>();
        for (int num : nums2) {
            if (numSet.contains(num)) {
                resultSet.add(num);
            }
        }
        int[] result = new int[resultSet.size()];
        int index = 0;
        for (int num : resultSet) {
            result[index] = num;
            index++;
        }
        return result;
    }
}

118. Pascal's Triangle(Easy)

Pascal's Triangle - LeetCode

把规则写出来就好了:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        list.add(1);
        while (list.size() <= numRows) {
            result.add(list);
            list = buildNextLevel(list);
        }
        return result;
    }

    private List<Integer> buildNextLevel(List<Integer> upperLevel) {
        int upperSize = upperLevel.size();
        List<Integer> nextLevel = new ArrayList<>();
        for (int i = 0; i <= upperSize; i++) {
            if (i == 0 || i == upperSize) {
                nextLevel.add(1);
            } else {
                nextLevel.add(upperLevel.get(i - 1) + upperLevel.get(i));
            }
        }
        return nextLevel;
    }
}

27. Remove Element(Easy)

Remove Element - LeetCode

 两个指针,一个表示判断的位置,一个表示结果的最后位置:

class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != val) {
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
}

409. Longest Palindrome(Easy)

Longest Palindrome - LeetCode

(1)构造map,存char和出现的次数:

class Solution {
    public int longestPalindrome(String s) {
        Map<Character, Integer> charNumMap = new HashMap<>();
        for (char c : s.toCharArray()) {
            if (charNumMap.containsKey(c)) {
                charNumMap.put(c, charNumMap.get(c) + 1);
            } else {
                charNumMap.put(c, 1);
            }
        }
        int result = 0;
        boolean hasOdd = false;
        for (Map.Entry<Character, Integer> entry : charNumMap.entrySet()) {
            int num = entry.getValue();
            if (num % 2 == 1) {
                hasOdd = true;
                result += num - 1;
            } else {
                result += num;
            }
        }
        if (hasOdd) {
            result++;
        }
        return result;
    }
}

(2)用set,存char,比(1)少一次循环:

class Solution {
    public int longestPalindrome(String s) {
        if(s==null || s.length()==0) return 0;
        HashSet<Character> hs = new HashSet<Character>();
        int count = 0;
        for(int i=0; i<s.length(); i++){
            if(hs.contains(s.charAt(i))){
                hs.remove(s.charAt(i));
                count++;
            }else{
                hs.add(s.charAt(i));
            }
        }
        if(!hs.isEmpty()) return count*2+1;
        return count*2;
    }
}

2022-03-27

292. Nim Game(Easy)

https://leetcode.com/problems/nim-game/

只要不是4的倍数,就是必定获胜的。

class Solution {
    public boolean canWinNim(int n) {
        return n % 4 != 0;
    }
}

451. Sort Characters By Frequency(Medium)

https://leetcode.com/problems/sort-characters-by-frequency/

(1)先记录出现的次数,再用TreeMap对次数排倒序,再输出

class Solution {
    public String frequencySort(String s) {
        Map<Character, Integer> charNumMap = new HashMap<>();
        for (char c : s.toCharArray()) {
            if (charNumMap.containsKey(c)) {
                charNumMap.put(c, charNumMap.get(c) + 1);
            } else {
                charNumMap.put(c, 1);
            }
        }
        Map<Integer, List<Character>> numCharMap = new TreeMap<>((o1, o2) -> o2 - o1); // 倒序
        for (Map.Entry<Character, Integer> entry : charNumMap.entrySet()) {
            int n = entry.getValue();
            char c = entry.getKey();
            if (numCharMap.containsKey(n)) {
                numCharMap.get(n).add(c);
            } else {
                List<Character> list = new ArrayList<>();
                list.add(c);
                numCharMap.put(n, list);
            }
        }
        StringBuilder builder = new StringBuilder();
        for (Map.Entry<Integer, List<Character>> entry : numCharMap.entrySet()) {
            int num = entry.getKey();
            for (char c : entry.getValue()) {
                for (int i = 0; i < num; i++) {
                    builder.append(c);
                }
            }
        }
        return builder.toString();
    }
}

(2)可以把TreeMap换成数组,下标表示出现的次数,时间复杂度会降低成O(n):

https://leetcode.com/problems/sort-characters-by-frequency/discuss/93445/O(n)-Easy-to-understand-Java-Solution

 

LTSPICE使用教程:导入第三方库模型进行仿真 LTSPICE导入第三方SPICE模型进行仿真,以英飞凌的第三方.lib模型为实例进行详解 阅读详情

相关推荐

NVIDIA DRIVE SDK学习(二)——NvMedia

可以通过使用NvSciBuf API通过NvMedia Tensor属性分配NvSciBuf来创建NvMedia张量。由于NvSciBuf API有助于NvMedia和NVIDIA®CUDA®之间的数据共享,这使得分配的张量可以在NvSciBuf API允许的情况下重复使用。它支持图像聚合操作。NvSciSync组件使得NvMedia组件可以与其他组件保持同步,比如CUDA组件、基于NvSciSync的组件等。立体视差模式:在这种模式下,该模块通过左图像和右图像来产生立体视差,从而进行物体深度测量。

weixin_39592381的博客 2981

重拾01

2022-02-13 78.Subsets(Medium) https://leetcode.com/problems/subsets/ 给出不含重复数字的数组,返回所有不含重复元素的子集。 (1)级联(通过增加一个数字,生成新的集合) class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result

oldmanw的博客 7231

聚宽sql数据库传递,中转数据库资料

聚宽sql数据库传递,中转数据库资料

Leetcode

@author stormma @date 2017/11/08 生命不息,奋斗不止! 前言 一个假acmer的重拾算法 算法是程序员的基本功,基本功的扎实程度一定上决定了你能走多远。前两年,急于学招式,招式学得差不多了,可是错过了大好的学习算法,练基本功的机会。不知不觉进入这个行业也两年多了,这两年基本上都在围绕着Javaweb做事,也算是有所收获吧,从一个接一个的业务项目,到后面

StormMaybin的博客 808

关于近来心得

从一月份开始,至今一个多月了,虽然有些时候还是有很多难只能凭着解做出来,但是感觉也学会了不少东西,包括数据结构、技巧和思等,感觉自己也算入门了。 从上周开始接触leetcode的周赛,碰巧遇上了『周赛』和『双周赛』,于是报名参加了一下,两次都是通过了2道。一看排名,好家伙,刚好在一半的名次,往后翻翻是好多没参赛的,不够第一次嘛,感觉还能接受,下次一定要争取做出三道。 可是今天周赛我就只做出了一道。。。第 2 卡在了最后两个案例过不去,找不出bug,哎,心累! 晚上刚刚又强打精神做了每日一

grizzly的博客 417

leetcodeleetcode汇总

熬过了期末整个人都懒懒的 要不断学习,勤更新鸭

qq_37367581的博客 357

一文讲清楚算法-计算机专业新生必看

从升学的角度来看,每年考研或者保研,在复试阶段一般都有机试,这个机试就是在规定时间内做几道算法;有些学校没有机试,但也会以笔试的形式出几道算法,让同学手写。

Sunny不要停的博客 1463

算法篇-重拾基础

算法篇 重拾基础2019.11.15日篇 之前有段时间一直有做一些基础,中途中止荒废了很长一段时间,现在打算重新捡起这些东西,并且打算开始坚持每天。一天两道叭,尽量一道基础一道稍微带有难度。有这样的决定是因为我突然想明白了,机会从来都是留给有准备的人,这次提前做准备,希望之后的比赛可以取得一个看得过去的成绩。在csdn上做记录,...

qq_43287656的博客 211

第六十四天代码随想录总结

今天是代码录第64天。进行一个总结。

dcbdcbhhh的博客 241

C++周记(一)

把C++重拾起来系统的第一周(4.16-4.23),也是同时为了复习数据结构与准备夏令营机试。计划着主要是结合Acwing算法基础课的章节进行,同时也会穿插二之前用Java过的力扣

funkoctopus的博客 345

力扣(合并区间)

给定一组可能重叠或相邻的整数区间,合并所有重叠或端点相接的区间,返回不重叠的最小区间列表。例如输入 [[1,3],[2,6],[8,10],[15,18]],输出 [[1,6],[8,10],[15,18]]。核心是先按左端点升序排序,再单次线性扫描完成合并,避免暴力两两比较。

weixin_52811458的博客 299

LeetCode 155. 最小栈|Python 解法详解

这道的关键是:使用主栈保存数据,辅助栈在每一层同步保存“截至当前位置的最小值”。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

a1250467048的博客 236

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 目要求在数组中找到两数之和等于目标值的下标。核心思是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 256

LeetCode //MySQL - 1204. Last Person to Fit in the Bus

This SQL query solves the problem of finding the last person who can board a bus without exceeding the 1000 kg weight limit. The solution involves: Calculating a running total of weights ordered by boarding turn using a window function Filtering to only in

Made in Code 367

leetcode】153. 寻找旋转排序数组中的最小值js

本文介绍了在旋转排序数组中寻找最小值的二分查找算法。通过比较中间元素与数组末尾元素,可以确定最小值所在区间:若中间值大于末尾值,则最小值在右侧;否则在左侧或当前位置。文章提供了两种实现方式,第一种通过样例总结返回nums[l],第二种采用更标准的二分写法,确保循环结束时left==right。两种方法时间复杂度均为O(logn),适用于解决LeetCode相关目。关键点在于利用旋转数组的特性缩小搜索范围。

2402_83244812的博客 150

LeetCode //C - 1203. Sort Items by Groups Respecting Dependencies

This problem involves sorting items with group constraints and dependency relations. The key steps are: Assign unique groups to items with no group (-1) Build dependency graphs for both items and groups Perform topological sorting on both graphs If both so

Made in Code 373

LeetCode hot100——最大子数组和

给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。6连续子数组 [4,-1,2,1] 的和最大,为 6。nums = [1]123如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的求解。

weixin_42927227的博客 212

10.LeetCode算法讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 219

栈和队列专(三):LeetCode 622. 设计循环队列|数组环形复用 + front/rear 边界详解

本文详细讲解了循环队列的设计与实现,重点分析了如何利用数组实现环形结构以避免空间浪费。文章首先通过示例说明普通数组队列的"假溢出"问,然后提出循环队列的解决方案。核心内容包括:1. 采用牺牲一个存储位置的方案区分队列空满状态;2. 明确front和rear指针的语义(front指向队首元素,rear指向下一个可插入位置);3. 使用取模运算实现下标的循环移动。文章完整实现了LeetCode 622要求的全部接口,并分析了各种边界情况,特别是队尾元素的获取方法。最后对比了数组实现与链式

Luminousone的博客 470

LeetCode 3597.分割字符串

时间复杂度:O(n) 或 O(n∣Σ∣),其中 n 是 s 的长度,∣Σ∣=26 是字符集合的大小。空间复杂度:O(n) 或 O(n∣Σ∣)。只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。因此,最终输出为 [“a”, “b”, “bc”, “c”, “cc”, “d”]。输出: [“a”,“b”,“bc”,“c”,“cc”,“d”]因此,最终输出为 [“a”, “aa”]。输入: s = “abbccccd”输入: s = “aaaa”输出: [“a”,“aa”]

tus00000的博客 221

LeetCode 30:串联所有单词的子串(滑动窗口) ——

滑动窗口——串联所有单词的子串

2601_96587588的博客 796
上一篇: 重拾刷题路01
oldmanw
博客等级 码龄12年 10粉丝 · 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值