初级算法01

news/2025/1/21 15:32:08/文章来源:https://www.cnblogs.com/20200109-zwh/p/18236473

用时:42min

class Solution {public int removeDuplicates(int[] nums) {/*** 双指针,右指针遍历整个数组,左指针记录有效值*/int l = 0, r = 0;Set<Integer> s = new HashSet<Integer>();for(; r < nums.length; r++){if(s.add(nums[r])){int t = nums[l];nums[l] = nums[r];nums[r] = t;l++;}}return l;}
}/*优化后版本*/
class Solution {public int removeDuplicates(int[] nums) {// 非严格递增序列:去除重复元素后的序列是递增的,也就是说重复元素相邻int l = 0, r = 0;for(; r < nums.length; r++){// 让左指针位置的元素是符合条件的,右指针一直向后遍历// 换句话说就是让左指针后面的相邻元素不与左指针元素重复if(nums[l] != nums[r]){nums[l + 1] = nums[r];l++;}}return l + 1;}
}


用时: 17min

class Solution {public int maxProfit(int[] prices) {// 当天买卖无收益,计算相邻两天的正收益之和 [贪心算法:通过局部最优解实现整体最优]// 假如是第一天买,第三天卖 (d3 - d1) = (d3 - d2) + (d2 - d1)int profit = 0;for(int i = 1; i < prices.length; i++){// profit += prices[i] - prices[i - 1] > 0 ? prices[i] - prices[i - 1] : 0;profit += Math.max(0, prices[i] - prices[i - 1]);}return profit;}
}


用时:38min

class Solution {public void rotate(int[] nums, int k) {/**先整体翻转,再局部翻转*/k %= nums.length;convertNums(nums, 0, nums.length - 1);convertNums(nums, 0, k - 1);convertNums(nums, k, nums.length - 1);}public void convertNums(int [] nums, int l , int r){while(l < r){int t = nums[l];nums[l] = nums[r];nums[r] = t;l++;r--;}}
}


用时:5min

class Solution {public boolean containsDuplicate(int[] nums) {// 占用额外内存Set<Integer> s = new HashSet<>();for(int num : nums){if(!s.add(num)){return true;}}return false;// 慢// Arrays.sort(nums);// for(int i = 1; i < nums.length; i++){//     if(nums[i - 1] == nums[i]){//         return true;//     }// }// return false;}
}


用时: 26min

class Solution {public int singleNumber(int[] nums) {if(nums.length == 1){return nums[0];}Arrays.sort(nums);int t = nums[0];int p = -1;for(int i = 1; i < nums.length; i++){if(nums[i] == p){continue;}if(t == nums[i] && t != p){p = nums[i];t = -1;}else{t = t == -1 ? nums[i] : t;}}return t;}
}/* 优化版本 */
class Solution {public int singleNumber(int[] nums) {// 位运算(异或运算,相同为零、不同为1, 0 ^ n = n,所以最后就剩下那个唯一的元素)if(nums.length == 1){return nums[0];}int result = 0;for(int num : nums){result ^= num;}return result;}
}


用时: 32min

class Solution {public int[] intersect(int[] nums1, int[] nums2) {// 散列桶计数Map<Integer, Integer> map = new HashMap<Integer, Integer>();for(int num : nums1){map.put(num, map.getOrDefault(num, 0) + 1);}int [] result = new int[nums1.length < nums2.length ? nums1.length : nums2.length];int index = -1;for(int num : nums2){int count = map.getOrDefault(num, 0);if(count > 0){result[++index] = num;map.put(num, count - 1);}}return Arrays.copyOfRange(result, 0, index + 1);}
}


用时: 33min

class Solution {public int[] plusOne(int[] digits) {int len = digits.length;boolean last = false;for(int i = len - 1; i >= 0; i--){int num = digits[i] + 1;if(num < 10){digits[i] = num;break;}else{digits[i] = num - 10;}if(i == 0){last = num > 9;}}int [] arr = last ? new int[digits.length + 1] : new int[digits.length];if(last){arr[0] = 1;System.arraycopy(digits, 0, arr, 1, digits.length);return arr;}else{return digits;}}
}/* 优化版本 */
class Solution {public int[] plusOne(int[] digits) {for(int i = digits.length - 1; i >= 0; i--){int num = digits[i] + 1;digits[i] = num % 10;if(num < 10){return digits;}}digits = new int[digits.length + 1];// 为什么之赋值一个就够了呢?因为原数组空间不够的情况只能是数值为 10000(n个零)digits[0] = 1; return digits;}
}


用时:5min

class Solution {public void moveZeroes(int[] nums) {int l = 0, r = 0;while(r < nums.length){if(nums[r] != 0){int t = nums[l];nums[l] = nums[r];nums[r] = t;l++;}r++;}}
}


用时:9min

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++){int num = target - nums[i];int idx = map.getOrDefault(num, -1);if(idx != -1){return new int[]{idx, i};}map.put(nums[i], i);}return new int[]{-1, -1};}
}


用时:20min

class Solution {public boolean isValidSudoku(char[][] board) {int [][] row = new int[9][9];int [][] column = new int[9][9];int [][][] block = new int[3][3][9];for(int i = 0; i < board.length; i++){for(int j = 0; j < board[0].length; j++){if(board[i][j] == '.'){continue;}int idx = board[i][j] - '0' - 1; // 数值要转化成对应索引,所以需要减一row[i][idx]++;column[j][idx]++;block[i / 3][j / 3][idx]++;if(row[i][idx] > 1 || column[j][idx] > 1 || block[i / 3][j / 3][idx] > 1){return false;    }}}return true;}
}


用时:15min

class Solution {public void rotate(int[][] matrix) {/** 先主对角线翻转,然后再左右翻转 */int [][] arr = new int[matrix.length][matrix[0].length];for(int i = 0; i < matrix.length; i++){for(int j = 0; j < i; j++){int num = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = num;}}for(int i = 0; i < matrix.length; i++){for(int j = 0; j < matrix[0].length / 2; j++){int num = matrix[i][j];matrix[i][j] = matrix[i][matrix[0].length -1 - j];matrix[i][matrix[0].length -1 - j] = num;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721734.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无限之环 题解

五星压行大师 \(lyh\) 表示:这是难得能让他的代码长度打破百行大关的题目(182行)。 首先,根据科技与狠活,本题可以黑白染色。源点联向白格,黑格连向汇点。 发现每个格子都可以连向四个方向,所以可以建立四个点,代表水管连到了上下左右四个方向。 设四元组 \((x,y,z,p)\…

7大系统之间的关系

7大系统之间的关系:MES(制造执行系统)、ERP(企业资源规划)、SCM(供应链管理)、WMS(仓库管理系统)、APS(高级计划和排程)、SCADA(监控控制与数据获取)、PLM(产品生命周期管理)

OpenAI正式发布第一个官方.NET版本库的测试版

尽管 Microsoft 和 OpenAI 长期以来一直是紧密相连的合作伙伴,但他们现在才开始为 .NET 开发人员发布官方 OpenAI 库,加入现有的社区库。这项工作的第一个测试版是支持 .NET 6 和 .NET Standard 2.0 的 OpenAI NuGet 包,现在是 2.0.0-beta.3 [1]版本,列出了大约 872,000 次…

玩转树莓派之系统安装篇

手头上刚好有一个树莓派4B介绍 树莓派是树莓派基金会下的一个明星产品(单板计算机),已经迭代到第五代了;它性能强大、开源、拓展性强、体积小,搞物联网开发的人基本都听说过这个玩意!笔者手上刚好有一块4B的板子,让我们一起来玩转树莓派 安装准备 硬件树莓派4B 4G内存版…

Keil uVersion 4单片机开发指南

MDK Keil uVersion 4使用教程,基于STC8H8K64U单片机1 软件安装 双击打开C51V901.exe弹出安装界面,点击Next>>点击同意协议勾选框,接着点击Next>>点击Browse...选择合适的目录,接着点击Next>>按要求填写相关信息,然后点击Next>>软件安装中,等待安…

读AI未来进行式笔记06自动驾驶技术

读AI未来进行式笔记06自动驾驶技术1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层,往往处于更低楼层的社会,要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车,而是路 2.2. 人是比机器更脆弱的生命,最微…

嵌入式代码优化技巧

笔者多年来总结的嵌入式代码优化技巧内存管理技巧 1.C/C++工程应尽量避免深拷贝,尽量用浅拷贝(指针或者引用),如果指针需要频繁拷贝,用智能指针是一种不错的选择 2.启用内存池管理线程的内存开销,事先在堆里边分配好,然后快速使用 避免复杂的浮点运算 1.复杂的浮点运算尽…

软件版本那些事

软件发布版本的常见类型软件版本跟测试阶段或者软件的生命周期所处的阶段有关,一般有以下几个版本 alpha 内测版本,仅限团队内部测试使用,不对外公开。大多数软件产品在向公众发布之前都要经过多个步骤。alpha版本是该系统的一部分,用于开发高效、准确和无缺陷的软件程序。…

RT-Thread和Infineon主持的嵌入式网络应用开发沙龙

2023年12月9日 深圳市维也纳好眠国际酒店 由RT-Thread和Infineon主持的嵌入式网络应用开发沙龙主题 会议由RT-Thread && Infineon共同主持,PSoc62开发板现场演示从0到1搭建智能数据网关RT-Thread介绍 rt-thread社区负责人郭占鑫郭工介绍RT-Thread英飞凌合作伙伴介绍 英…

小白学开源

如何参与到GitHub开源项目中去第一步 访问程序员交友网站,注册GitHub账号,注册流程请自行了解,如果已有账户请登录第二步 在搜索框输入你想查找的项目,例如cjson第三步 选择你感兴趣的那个项目,这里选择排行最前的那个,它的收藏数有9.5k第四步 先点击Fork生成自己的子仓库…

RT-Thread Studio使用教程

RT-Thread工程开发教程,基于PSoc62开发板介绍 RT-Thread Studio是官方出品的一款专门针对RT-Thread嵌入式开发、部署、调试、测试的集成开发环境,它基于Eclipse开源项目开发,极大的提高了嵌入式开发者的开发效率,目前最新版本是2.26 下载 使用浏览器打开RT-Thread官网,选择…

一款.NET开源、免费、实用的多功能原神工具箱(改善桌面端玩家的游戏体验)

前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱。工具箱介绍 胡桃工具箱是一款.NET开源(MIT License)、免费、实用的多功能原神工具箱,专为现代化 Windows 平台设计,旨在改善桌面端玩家的游…