Algorithm之路三十五:Search Insert Position

本文介绍了一种利用二分查找法解决在有序数组中搜索目标元素的问题,并提供了一个C++实现示例。当目标元素不存在于数组中时,该算法能够确定其正确的插入位置。

题目:

给出一个从小到大排号序的数组nums,给出一个int型的target,要求如果target在nums中,则返回target的索引,如果不在,则返回target应该插入的位置。

举例:(例子来源于https://leetcode.com/problems/search-insert-position/description/)

Example 1:

Input: [1,3,5,6], 5
Output: 2

Example 2:

Input: [1,3,5,6], 2
Output: 1

Example 3:

Input: [1,3,5,6], 7
Output: 4

Example 1:

Input: [1,3,5,6], 0
Output: 0

思路:

二分法

代码:

#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
int searchInsert(vector<int>& nums, int target)
{
	int length = nums.size();
	if(length == 0) return 0;
	if(target < nums[0]) return 0;
	if(target > nums[length - 1]) return length;
	int head = 0,tail = length,center;
	while(head < tail)
	{
		center = (head + tail)/2;
		if(nums[center] == target) return center;
		if(nums[center] < target) head = center;
		else tail = center;
		if(head + 1 == tail)
		{
			if(nums[head] == target) return head;
			else return tail;
		}
	}
}
int main()
{
	vector<int> nums;
	nums.push_back(1);
	nums.push_back(3);
	nums.push_back(5);
	nums.push_back(6);
	cout<<searchInsert(nums, 0)<<endl;
	return 0;
}


时间复杂度:

O(logn)。

空间复杂度:

O(1)。

#include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <iomanip> #include <limits> // 学生类 class Student { public: std::string id; std::string name; int math; int chinese; int english; // 计算平均分 double average() const { return (math + chinese + english) / 3.0; } // 计算总分 int total() const { return math + chinese + english; } // 输出学生基本信息 void display() const { std::cout << std::left << std::setw(10) << id << std::setw(10) << name << std::setw(5) << math << std::setw(5) << chinese << std::setw(5) << english << std::endl; } }; // 系统类 class StudentManagementSystem { private: std::vector<Student> students; // 检查学号是否重复 bool isIdDuplicate(const std::string& id) const { for (const auto& s : students) { if (s.id == id) { return true; } } return false; } // 检查成绩是否有效 bool isGradeValid(int grade) const { return grade >= 0 && grade <= 100; } // 获取有效的插入位置 int getValidInsertPosition() const { int position; while (true) { std::cout << "请输入要插入的位置(从 1 开始,输入 0 表示追加到末尾):"; while (!(std::cin >> position) || position < 0) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个非负整数:"; } if (position == 0 || position <= static_cast<int>(students.size()) + 1) { break; } std::cout << "插入位置超出范围,请重新输入。" << std::endl; } return position; } public: // 创建学生信息 void create() { Student s; while (true) { std::cout << "请输入学号:"; std::cin >> s.id; if (isIdDuplicate(s.id)) { std::cout << "该学号已存在,请重新输入。" << std::endl; } else { break; } } std::cout << "请输入姓名:"; std::cin >> s.name; while (true) { std::cout << "请输入数学成绩:"; std::cin >> s.math; if (isGradeValid(s.math)) { break; } else { std::cout << "数学成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } while (true) { std::cout << "请输入语文成绩:"; std::cin >> s.chinese; if (isGradeValid(s.chinese)) { break; } else { std::cout << "语文成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } while (true) { std::cout << "请输入英语成绩:"; std::cin >> s.english; if (isGradeValid(s.english)) { break; } else { std::cout << "英语成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } int position = getValidInsertPosition(); if (position == 0) { students.push_back(s); } else { students.insert(students.begin() + position - 1, s); } std::cout << "学生信息添加成功!" << std::endl; } // 一次添加多个人的数据 void addMultiple() { int num; std::cout << "请输入要添加的学生数量:"; while (!(std::cin >> num) || num <= 0) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个正整数:"; } int position = getValidInsertPosition(); std::vector<Student> newStudents; for (int i = 0; i < num; ++i) { std::cout << "添加第 " << i + 1 << " 个学生信息:" << std::endl; Student s; while (true) { std::cout << "请输入学号:"; std::cin >> s.id; if (isIdDuplicate(s.id)) { std::cout << "该学号已存在,请重新输入。" << std::endl; } else { break; } } std::cout << "请输入姓名:"; std::cin >> s.name; while (true) { std::cout << "请输入数学成绩:"; std::cin >> s.math; if (isGradeValid(s.math)) { break; } else { std::cout << "数学成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } while (true) { std::cout << "请输入语文成绩:"; std::cin >> s.chinese; if (isGradeValid(s.chinese)) { break; } else { std::cout << "语文成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } while (true) { std::cout << "请输入英语成绩:"; std::cin >> s.english; if (isGradeValid(s.english)) { break; } else { std::cout << "英语成绩无效,请输入[0, 100]范围内的成绩。" << std::endl; } } newStudents.push_back(s); std::cout << "第 " << i + 1 << " 个学生信息准备好!" << std::endl; } if (position == 0) { students.insert(students.end(), newStudents.begin(), newStudents.end()); } else { students.insert(students.begin() + position - 1, newStudents.begin(), newStudents.end()); } std::cout << num << " 个学生信息添加成功!" << std::endl; } // 汇总学生信息 void summary() { if (students.empty()) { std::cout << "暂无学生信息!" << std::endl; return; } std::cout << std::left << std::setw(10) << "学号" << std::setw(10) << "姓名" << std::setw(5) << "数学" << std::setw(5) << "语文" << std::setw(5) << "英语" << std::setw(7) << "平均分" << std::setw(5) << "总分" << std::endl; for (const auto& s : students) { std::cout << std::left << std::setw(10) << s.id << std::setw(10) << s.name << std::setw(5) << s.math << std::setw(5) << s.chinese << std::setw(5) << s.english << std::setw(7) << std::fixed << std::setprecision(2) << s.average() << std::setw(5) << s.total() << std::endl; } } // 按总分降序排序 void sortByTotal() { if (students.empty()) { std::cout << "暂无学生信息!" << std::endl; return; } std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.total() > b.total(); }); std::cout << "排序成功!" << std::endl; } // 查询学生信息 void query() { std::string id; std::cout << "请输入要查询的学号:"; std::cin >> id; for (const auto& s : students) { if (s.id == id) { s.display(); return; } } std::cout << "未找到该学号的学生信息!" << std::endl; } // 显示所有学生信息 void display() { if (students.empty()) { std::cout << "暂无学生信息!" << std::endl; return; } std::cout << std::left << std::setw(10) << "学号" << std::setw(10) << "姓名" << std::setw(5) << "数学" << std::setw(5) << "语文" << std::setw(5) << "英语" << std::endl; for (const auto& s : students) { s.display(); } } // 从文件导入学生信息 void importFromFile() { std::string filename; std::cout << "请输入要导入的文件名:"; std::cin >> filename; std::ifstream infile(filename); if (!infile) { std::cout << "文件打开失败!" << std::endl; return; } std::vector<Student> fileStudents; Student s; while (infile >> s.id >> s.name >> s.math >> s.chinese >> s.english) { if (!isIdDuplicate(s.id) && isGradeValid(s.math) && isGradeValid(s.chinese) && isGradeValid(s.english)) { fileStudents.push_back(s); } else { std::cout << "文件中 " << s.id << " 学生信息无效,跳过该记录。" << std::endl; } } infile.close(); if (!fileStudents.empty()) { int position = getValidInsertPosition(); if (position == 0) { students.insert(students.end(), fileStudents.begin(), fileStudents.end()); } else { students.insert(students.begin() + position - 1, fileStudents.begin(), fileStudents.end()); } std::cout << "文件导入成功,共导入 " << fileStudents.size() << " 条有效记录!" << std::endl; } else { std::cout << "文件中无有效记录可导入。" << std::endl; } } // 将学生信息导出到文件 void exportToFile() { std::string filename; std::cout << "请输入要导出的文件名:"; std::cin >> filename; std::ofstream outfile(filename); if (!outfile) { std::cout << "文件打开失败!" << std::endl; return; } for (const auto& s : students) { outfile << s.id << " " << s.name << " " << s.math << " " << s.chinese << " " << s.english << std::endl; } outfile.close(); std::cout << "文件导出成功!" << std::endl; } }; int main() { StudentManagementSystem sms; int choice; while (true) { std::cout << "学生成绩管理系统:" << std::endl; std::cout << "1 创建" << std::endl; std::cout << "2 添加" << std::endl; std::cout << "3 汇总" << std::endl; std::cout << "4 排序" << std::endl; std::cout << "5 查询" << std::endl; std::cout << "6 显示" << std::endl; std::cout << "7 文件导入" << std::endl; std::cout << "8 文件导出" << std::endl; std::cout << "9 退出" << std::endl; std::cout << "请选择:"; while (!(std::cin >> choice)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "输入无效,请输入一个整数:"; } switch (choice) { case 1: sms.create(); break; case 2: sms.addMultiple(); break; case 3: sms.summary(); break; case 4: sms.sortByTotal(); break; case 5: sms.query(); break; case 6: sms.display(); break; case 7: sms.importFromFile(); break; case 8: sms.exportToFile(); break; case 9: std::cout << "程序退出,感谢使用!" << std::endl; return 0; default: std::cout << "无效的选择,请重新输入!" << std::endl; } } return 0; } 帮我画出这个程序的流程图和类图
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值